我有一个数据库字段名称调用
Code
,我尝试使用如下所示的变量名称来选择它:
Declare @var1 = [Code]
(SELECT @var1
FROM [VoucherType]
WHERE [DeletedBy] IS NULL
AND [AutoID] = 1)
显然,SQL 会将
@var1
解释为字符串,而不是数据库的字段,我该如何以这种方式将 @var1
识别为字段名称 [Code]
而不是可能没有任何 select 或的字符串if 语句。
试试这个:
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
您需要使用动态 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
这篇文章可能会有所帮助
问候
您不能在 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 的诅咒和祝福
请尝试使用以下代码:
DECLARE @var1 VARCHAR(50)
SET @var1 = '[Code]'
EXEC ('SELECT ' + @var1 + ' FROM [VoucherType]
WHERE [DeletedBy] IS NULL AND [AutoID] = 1 ')
晚了 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