在SP中动态引用SQL Server列

在SP中动态引用SQL Server列,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,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 有没

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

您需要动态SQL,但请先阅读,以确保您不会打开自己进行
SQL注入

阅读@sqlmeane answer中的链接

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

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

exec (@sql)

如果已经预定义了过程中所有可接受的列名,则可以使用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
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