SQL Server 2017 - 如何在动态 SQL 中的 SELECT 中传递参数
SQL Server 2017 - How to pass a parameter in a SELECT inside a dynamic SQL
我创建了以下 table:
CREATE TABLE TestABC (
colID INT NOT NULL,
colName VARCHAR(10) NULL,
);
INSERT INTO TestABC
(colID, colName)
VALUES
(1,'ABC'),
(2,'DEF'),
(3,'GHI');
当我运行下面的查询针对上面的table...
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 中的实际值为空。并且根据sql 服务器逻辑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)
作为默认值,这是一种不好的做法,可能会减慢您的查询速度。
我创建了以下 table:
CREATE TABLE TestABC (
colID INT NOT NULL,
colName VARCHAR(10) NULL,
);
INSERT INTO TestABC
(colID, colName)
VALUES
(1,'ABC'),
(2,'DEF'),
(3,'GHI');
当我运行下面的查询针对上面的table...
DECLARE @Name varchar(max)
select @Name = colName from dbo.TestABC where colID = '3'
print @Name
我得到了以下预期结果,这很好:
GHI
现在,我试图在动态 SQL:
中使用我的 @Name 参数传递 SELECTDECLARE @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 中的实际值为空。并且根据sql 服务器逻辑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)
作为默认值,这是一种不好的做法,可能会减慢您的查询速度。