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`
我收到上述错误的无效错误。
答案 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