在存储过程的SQL Server中,我想在给定列名的情况下获取单行表的列中的值,并将该值赋给变量。列名可能每次都不同(我在运行时使用T-SQL查询模式)。
下面给出的例子尽可能小,我重要的是你不能假设列名永远是entity_client
,它可能是任何东西,但是(由于审讯INFORMATION SCHEMA
)我们将赋值给变量@entity_column_name
。
示例准备SQL:
IF OBJECT_ID('tempdb..#foo') IS NOT NULL
BEGIN;
DROP TABLE #foo;
END;
CREATE TABLE #foo
(
id INT,
entity_client NVARCHAR(255)
);
INSERT INTO #foo VALUES (1, 'clientcode|client_number');
DECLARE @entity_column_name NVARCHAR(255) = 'entity_client';
DECLARE @entity_column_value NVARCHAR(255);
我尝试了以下内容:
SELECT TOP 1 @entity_column_name = [@entity_column_value]
FROM #foo;
...会产生错误
无效的列名称'@entity_column_value'
我也尝试过:
EXEC('SELECT TOP 1 @entity_column_value = [' + @entity_column_name + '] FROM #foo;');
会产生另一个错误
必须声明标量变量“@entity_column_value”
以下工作,但不幸的是列名称是硬编码的 - 我希望能够改变列名称:
SELECT TOP 1 @entity_column_value = [entity_client]
FROM #foo;
是的,我查看了SO并发现了以下问题,但是它们没有提供将值分配给变量的答案,在这两种情况下SELECT
输出都只是转储到屏幕:
答案 0 :(得分:1)
这实际上有效,但您需要声明输出变量:
DECLARE @entity_column_name NVARCHAR(255) = 'entity_client';
DECLARE @entity_column_value NVARCHAR(255);
DECLARE @tsql NVARCHAR(1000) = 'SELECT TOP 1 @entity_column_value = [' + @entity_column_name + '] FROM #foo;'
EXEC sp_executesql @tsql, N'@entity_column_value NVARCHAR(255) OUTPUT',
@entity_column_value OUTPUT;