如何使用动态查询连接行?

时间:2011-08-09 11:08:43

标签: sql-server sql-server-2008

DECLARE @EmployeeList varchar(100)
SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') + CAST(Emp_UniqueID AS     varchar(5)) FROM SalesCallsEmployees WHERE SalCal_UniqueID = 1
SELECT @EmployeeList`

我已经看到这个用于将行连接到CSV。我希望这个使用动态查询请帮助我。

如何在动态查询中编写此内容?我正在努力,但我无法理解......

请帮帮我。以下是我已经尝试过的例子

Declare @LGroup varchar(max);
declare @DbName varchar(100);
set @DBName='Device_tenant';
set @LGroup ='COALESCE('''+@LGroup+''' + '','','''')'+' UserName     FROM  '+@DBName+'.dbo.dvcmgmt_UserMaster'
exec (@LGroup)
select (@LGroup)
print @LGroup
print @DBName`

我得到上面的空值..

Declare @LGroup varchar(max);
declare @DbName varchar(100);
set @DBName='Device_tenant';
set @LGroup ='(COALESCE('''+@LGroup+''' + '','','''') '+' Convert(nvarchar    (10),'+UserID+'))' +' FROM  '+@DBName+'.dbo.dvcmgmt_UserMaster'
exec (@LGroup)
select (@LGroup)
print @LGroup
print @DBName`

我收到上述错误的无效错误。

3 个答案:

答案 0 :(得分:1)

@LGroup将没有连接的值,因为这是您运行的SQL。

除非使用sp_executesql,否则无法从动态SQL传递值。所以用这个重写

编辑,因为@Jnk和@Aaron指出......

真的应该阅读权威的“The Curse and Blessings of Dynamic SQL

答案 1 :(得分:1)

你将在这里遇到的主要问题是你只是从查询中传递一个变量,所以如果你正在使用多行数据,这些数据会非常快。< / p>

另外,我从未尝试将查询的整个结果插入到单个声明的变量中,因此我不确定这是如何工作的。我能做的是向您展示尝试查询所需内容的正确语法,并向您展示如何将变量从预先编写的SQL语句中传回。

DECLARE @Bound DATETIME, @Rows INT
SELECT @Bound = '1/1/2011'

SELECT @SQL = N'(SELECT @RowsOut = COUNT(*) FROM [dbo].[' + @Table + '] '
SELECT @SQL = @SQL + N'WHERE tran_date < CONVERT(DATETIME,@BoundIn))'

EXEC sp_executesql @SQL, N'@BoundIN SQL_VARIANT, @RowsOut INT OUTPUT', @BoundIn = @Bound, @RowsOut = @Rows OUTPUT

为变量分配多个值可能存在问题。我必须用它来解决这个问题,但希望这能让你朝着正确的方向前进。

顺便说一句,您可以使用ISNULL()函数来消除传递给聚合的值的空值。任何与空值连接的字符串值都会产生另一个空值。

答案 2 :(得分:0)

Declare @string nvarchar(max);

set @string =N'select @LGroup=COALESCE(@LGroup+ '','','''') +  Convert(nvarchar    (10),UserID) FROM  '+@DBname+'.dbo.dvcmgmt_UserMaster; print @LGroup;'

execute sp_executesql @query=@string,@Params=N'@LGroup nvarchar(max)     OUTPUT',@LGroup=@LGroup Output