在存储过程中动态引用SQL Server列

3

SQL 2008

你好,

我需要在 SQL 中执行一个比较不同寻常的任务。虽然这个任务有点复杂,但我会尽量简化它。

我需要动态地选择一个列,就像这样:

declare @ColName varchar(50)

select @ColName = 'Column1' --This is an actual column name in a real table called 'MyTable'

select @ColName from MyTable where Column2 = 123

有没有类似这样的方法?非常感谢您的帮助或指导!
谢谢, Jason
4个回答

1

1
DECLARE @colNameIn AS varchar(50) = 'Column1'

DECLARE @template AS varchar(MAX) = 'select {@ColName} from MyTable where Column2 = 123' -- This template can be expanded

-- Protect yourself from injection or invalid columns:
DECLARE @ColName AS varchar(50)
SELECT @ColName = COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable' 
    AND COLUMN_NAME = @ColNameIn

IF @ColName IS NOT NULL
BEGIN
    DECLARE @sql AS varchar(MAX)
    SET @sql = REPLACE(@template, '{@ColName}', QUOTENAME(@ColName))
    EXEC (@sql)
END

0

请阅读@SQLMenace答案中的链接!

declare @ColName varchar(50)
select @ColName = 'Column1'

declare @sql varchar(MAX)
select @sql = 'select ' + @ColName + ' MyTable where Column2 = 123'

exec (@sql)

0
如果您在存储过程中预定义了所有可接受的列名,那么可以使用CASE语句来实现此操作。
DECLARE @ColName varchar(50)

SET @ColName = 'Column1'

SELECT CASE @ColName
         WHEN 'Column1' THEN Column1
         WHEN 'Column2' THEN Column2
       END
FROM MyTable
WHERE Column2 = 123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接