【问题标题】:Referencing SQL Server columns dynamically in SP在 SP 中动态引用 SQL Server 列
【发布时间】:2011-05-03 17:32:11
【问题描述】:
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
sql-server
tsql
stored-procedures
【解决方案2】:
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
【解决方案3】:
阅读@SQLMenace 答案中的链接!
declare @ColName varchar(50)
select @ColName = 'Column1'
declare @sql varchar(MAX)
select @sql = 'select ' + @ColName + ' MyTable where Column2 = 123'
exec (@sql)
【解决方案4】:
如果您已在过程中预定义了所有可接受的列名,则可以使用 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