在SQL查询中动态选择列

问题描述 投票:0回答:5

我有一个数据库字段名称调用

Code
,我尝试使用如下所示的变量名称来选择它:

Declare @var1 = [Code]

(SELECT @var1
 FROM [VoucherType]
 WHERE [DeletedBy] IS NULL
 AND [AutoID] = 1)

显然,SQL 会将

@var1
解释为字符串,而不是数据库的字段,我该如何以这种方式将
@var1
识别为字段名称
[Code]
而不是可能没有任何 select 或的字符串if 语句。

sql sql-server
5个回答
14
投票

试试这个:

DECLARE @var1 VARCHAR(20)
DECLARE @sql VARCHAR(255)

SET @var1 = 'Code'
SET @sql = 'select ' + QUOTENAME(@var1) + ' from [VoucherType] where [DeletedBy] is null and [AutoID] = 1'

EXEC sp_executesql @sql

您必须编写动态查询,并使用

sp_executesql

执行

要在“动态”方面添加更多内容,请使用存储过程。请参阅此处的示例:

http://www.marten-online.com/database/execute-dynamic-sql-in-mssql.html

也就是说...如果您使用的是 Microsoft SQL SERVER


5
投票

您需要使用动态 SQL。

declare @ColName varchar(128)

declare @sql varchar(4000)

Set @ColName='Code';

select @sql = 'SELECT '+@ColName+'
  FROM [VoucherType]
 WHERE [DeletedBy] IS NULL
 AND [AutoID] = 1'
  exec sp_executesql @sql
go

这篇文章可能会有所帮助

从变量中的名称访问表

SQL:根据变量选择动态列名

问候


2
投票

您不能在 SELECT 语句中使用类似的变量。

您将需要创建动态 TSQL。

您不指定 RDBMS,但在 SQL Server 中您可以使用

sp_executesql
(最好)或
EXEC

Declare @var1 varchar(100)
Declare @sql varchar(1000)

SET @var1 = '[Code]' 
SET @sql = ' select ' + @var1 + ' from [VoucherType]' +
           ' where [DeletedBy] is null and [AutoID] = 1'

EXEC sp_executesql @sql

请务必阅读:动态 SQL 的诅咒和祝福


0
投票

请尝试使用以下代码:

DECLARE @var1 VARCHAR(50)

SET @var1 = '[Code]'

EXEC ('SELECT ' + @var1 + ' FROM [VoucherType]  
       WHERE [DeletedBy] IS NULL AND [AutoID] = 1 ')

0
投票

晚了 12 年零 8 个月!

对于此处使用的交叉应用,请确保在唯一索引上使用它(除非您需要对象数组)

-- INIT database
CREATE TABLE Product (
  ProductID INT IDENTITY(1, 1),
  Preferred_Data_Point INT,
  Data_Point_1 VARCHAR(10),
  Data_Point_2 VARCHAR(10),
  Data_Point_3 VARCHAR(10)
);

INSERT INTO Product(Data_Point_1, Data_Point_2, Data_Point_3) VALUES ('Hello', 'World', '*wave*');
INSERT INTO Product(Data_Point_1, Data_Point_2, Data_Point_3) VALUES ('Hello', 'World', '*wave*');
INSERT INTO Product(Data_Point_1, Data_Point_2, Data_Point_3) VALUES ('Hello', 'World', '*wave*');

-- Dynamic Selection Criteria (Define Column Name) (Useful for views)
SELECT 
    [Product].ProductID,
    JSON_VALUE(ProductJSON.JSON, CONCAT('$.Data_Point_', Product.ProductID)) AS [value]
FROM Product [Product] WITH (NOLOCK)
CROSS APPLY -- 1to1 Cross Apply Row w/ JSON equivalent
(
    SELECT (SELECT *
    FROM Product [jsonProduct] WITH (NOLOCK)
    WHERE jsonProduct.ProductID = Product.ProductID
    FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER) [JSON]
) [ProductJSON];

-- More Obvious
INSERT INTO Product(Data_Point_1, Data_Point_2, Data_Point_3, Preferred_Data_Point) VALUES ('Hello', 'World', '*wave*', 2);
INSERT INTO Product(Data_Point_1, Data_Point_2, Data_Point_3, Preferred_Data_Point) VALUES ('Hello', 'World', '*wave*', 3);
INSERT INTO Product(Data_Point_1, Data_Point_2, Data_Point_3, Preferred_Data_Point) VALUES ('Hello', 'World', '*wave*', 1);

-- Select based on rows other column values (same as before, but different)
SELECT 
    [Product].ProductID,
    JSON_VALUE(ProductJSON.JSON, CONCAT('$.Data_Point_', Product.Preferred_Data_Point)) AS [value]
FROM Product [Product] WITH (NOLOCK)
CROSS APPLY -- 1to1 Cross Apply Row w/ JSON equivalent
(
    SELECT (SELECT *
    FROM Product [jsonProduct] WITH (NOLOCK)
    WHERE jsonProduct.ProductID = Product.ProductID
    FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER) [JSON]
) [ProductJSON];

预览这里: SQLFiddle

© www.soinside.com 2019 - 2024. All rights reserved.