SQL Server:从字符串列名获取列值,将值赋给变量

时间:2018-02-19 00:44:38

标签: sql-server tsql stored-procedures

在存储过程的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输出都只是转储到屏幕:

Get column value from string column name sql

Get column value from dynamically achieved column name

1 个答案:

答案 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;