SQL Server 2017 - 如何在动态 SQL 中的 SELECT 中传递参数

Posted

技术标签:

【中文标题】SQL Server 2017 - 如何在动态 SQL 中的 SELECT 中传递参数【英文标题】:SQL Server 2017 - How to pass a parameter in a SELECT inside a dynamic SQL 【发布时间】:2019-02-22 17:43:44 【问题描述】:

我创建了下表:

CREATE TABLE TestABC (
  colID INT NOT NULL,
  colName VARCHAR(10) NULL,
  );

INSERT INTO TestABC 
    (colID, colName) 
VALUES 
    (1,'ABC'),
    (2,'DEF'),
    (3,'GHI');

当我对上表运行以下查询时...

DECLARE @Name varchar(max)
select @Name = colName from dbo.TestABC where colID = '3'
print @Name

我得到以下预期结果,这很好:

GHI

现在,我正在尝试在动态 SQL 中传递带有 @Name 参数的 SELECT:

DECLARE @sql varchar(max)
DECLARE @Name varchar(max)
set @sql = '
select ' + @Name + ' = colName from dbo.TestABC where colID = ''3''
'
print @sql

我遇到的问题是,在动态 SQL 中,我的 @Name 参数没有得到评估并导致空白或 NULL。另外,我的整个动态 sql 参数 @sql 也以 NULL 结尾。

我完全意识到,如果我在动态 SQL 之前添加以下附加行,则应该正确评估 @Name...

SELECT @Name = colName from dbo.TestABC

但是,这不是我的目标。我需要 SELECT 是完全动态的,因为我最终将动态传递我的 dbo.TestABC。因此,我不能像上面的 SELECT 那样预先分配我的 @Name 参数。

如何在动态 SQL 中的 SELECT 中填充 @Name 和 @sql 参数?

【问题讨论】:

为什么这需要是动态的?如果您尝试执行作业,则该语句没有任何动态。要回答为什么你得到NULL,那是因为你的语句评估为set @sql = 'select ' + NULL + ' = colName from dbo.TestABC where colID = ''3''',并将NULL连接到一个字符串=NULL @Larnu,它需要是动态的,因为我将在我的整体逻辑中动态地传递我的表格。 也许最好包含你的全部逻辑? :) 【参考方案1】:

当你这样做时:

set @sql = '
select ' + @Name + ' = colName from dbo.TestABC where colID = ''3''
'

变量@Name 中的实际值为空。并且根据sql server逻辑字符串+null为null。

做你想做的事:

DECLARE @sql nvarchar(max)
DECLARE @Name nvarchar(max)
set @sql = '
select @someVariable = colName from dbo.TestABC where colID = ''3''
'
EXECUTE sp_executesql @sql, N'@someVariable varchar(max) OUTPUT', @someVariable = @Name OUTPUT;
select @Name; -- this will print your colName

不要使用(max) 作为默认值,这是一种不好的做法,可能会减慢查询速度。

【讨论】:

如何在您的示例中使用或声明我的输出参数?

以上是关于SQL Server 2017 - 如何在动态 SQL 中的 SELECT 中传递参数的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 OPENJSON 和 SQL Server 2017 解析具有动态键的对象数组

如何在SQL Server计算XX年第XX周是哪几天

在 sql server 中,使用整数变量构建动态 sql

如何在 SQL Server 中清理(防止 SQL 注入)动态 SQL?

Sql Server 2017 安装问题记录

SQL Server如何防止动态sql中的sql注入