我创建了存储过程,以便用户可以将多个逗号分隔值选择为单个参数。
这里我在循环这些值时遇到了一些问题。这是代码
Alter PROCEDURE [dbo].[Testing] @Databases varchar(4096)
AS Begin
SET NOCOUNT ON;
Declare @cnt varchar(500)
Declare @sql varchar(Max) = ''
Declare @DB varchar(50)
;WITH MyCTE
AS (SELECT * FROM [dbo].[fnSplitStringList] (@Databases))
select * into #temp from MyCTE
DECLARE tenant_cursor CURSOR FOR
select * from #temp
OPEN tenant_cursor;
FETCH NEXT FROM tenant_cursor INTO @cnt;
WHILE @@FETCH_STATUS = 0
BEGIN
select @DB = dbname from CountryLookup where dbName = @cnt
if @sql = ''
Begin
SET @sql = 'select C1, C2, C3
from ' + @DB + '.dbo.T1
inner join DB1.T2 on T1.C4 = T2.C4
'
End
Else
Begin
SET @sql = 'select C1, C2, C3
from ' + @DB + '.dbo.T1
inner join DB1.T2 on T1.C4 = T2.C4
'
End
FETCH NEXT FROM tenant_cursor INTO @cnt;
END
CLOSE tenant_cursor;
DEALLOCATE tenant_cursor;
Drop table #temp
exec (@sql)
END
现在我执行我的proc就像exec [dbo]。[测试]'美国,日本,法国'
它只给了我法国的记录。
有人可以在我错的地方帮助我。?
答案 0 :(得分:1)
好吧,我可以看到一些奇怪的逻辑,比如if @sql = ''
;但是你的错误的原因只是你要覆盖yor @sql
变量,所以当你执行它时,它只返回光标检索的最后一个国家的值。
答案 1 :(得分:1)
我不推荐这种方法,但如果仔细观察,你会发现你永远不会附加到@sql,只是分配给它。
将您的else子句更改为SET @sql = @sql + ...
。