我希望返回一个视图名称和所有记录ID,其中billingAddress!= shippingAddress进一步审核。我需要查询一个数据库中的所有视图。这是我的思考过程,如果他们是一个更好的方式或更快的方式来编写查询一定帮助我!
我坚持的是如何使用recordID返回视图名称?
Create Table #T (ID Int Identity Not Null, ViewNames VARCHAR(1000)
Create Table #2 (viewNames varchar(1000))
Insert Into #T (ViewNames)
Select '['+C.Table_Catalog+'].['+C.Table_Schema+'].['+C.Table_Name+']' TableName
FROM Information_Schema.Columns c
Join information_schema.Tables T on C.Table_Catalog = T.Table_Catalog
AND C.Table_Schema = T.Table_Schema
AND C.Table_Name = T.Table_Name
Where T.Table_Type = 'View'
Group By '['+C.Table_Catalog+'].['+C.Table_Schema+'].['+C.Table_Name+']'
---现在这是我坚持的部分,因为我不知道如何在每次迭代时将视图名称插入表中
Declare @N int, @Str nvarchar(2000), @viewname nvarchar(2000), @MaxID int
Set @N = 1
Select @MaxID = Max(ID)
From #T
While (@N<@MaxID)
Begin
Select @viewname= viewname
From #T
Set @Str = ' Insert Into #2(viewname)
Select Top 1 '''+@viewname+'''
From '+@viewname+'
where exists(Select recordID from '+@viewname+' where [shipaddress] != [billaddress] ) '
Exec sp_eecutesql @str
Set @N = @N + 1
结束 从#t
中选择*答案 0 :(得分:2)
尝试更改动态查询。
您说您想要视图名称和记录ID,因此您需要在#2
中添加一列SET @Str = 'INSERT INTO #2(viewname, recordid)
SELECT ''' + quotename(@viewname) + ''', recordID
FROM '+ quotename(@viewname) + '
WHERE [shipaddress] != [billaddress]'
EXEC sp_executesql @str
除非您确定对象名称,否则在构建动态SQL时应尝试使用引号;
你的逻辑确实存在问题......
您在查询中缺少where子句,该值将值赋给@viewname
试试这个......
SELECT @viewname= viewname
FROM #T
WHERE ID = @N
答案 1 :(得分:0)
我不明白sql返回行集,因此你的变量@viewname不能逐行赋值。默认情况下,您的@viewname将被分配到表T的最后一行。