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

2024-04-08

我创建了下表:

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 参数?


当你这样做时:

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

变量@Name内的实际值为null。并且根据sql server逻辑 string + 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)作为默认值,这是一种不好的做法,可能会减慢您的查询速度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 2017 - 如何在动态 SQL 内的 SELECT 中传递参数 的相关文章

随机推荐