查询数据库中的所有视图

Query All Views In Database

我正在寻找 return 视图名称和所有记录 ID,其中 billingAddress != shippingAddress 以进一步审查。我需要查询一个数据库中的所有视图。这是我的思考过程,如果他们是编写查询的更好或更快的方法,请务必帮助我!

我卡住的是如何return view name with the 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+']'

---现在这是我坚持的部分,因为我不知道如何在每次迭代中也将视图名称插入 table

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

结束 Select * 来自#t

尝试像这样更改您的动态查询。

您说您想要视图名称和记录 ID,因此您需要向 #2 添加一列

SET @Str = 'INSERT INTO #2(viewname, recordid)
SELECT ''' + quotename(@viewname) + ''', recordID 
FROM '+ quotename(@viewname) + '
WHERE [shipaddress] != [billaddress]'

EXEC sp_executesql @str

除非您确定对象名称,否则在构建动态时应尝试使用 quotename SQL

不过你的逻辑确实有问题...

您在将值分配给@viewname

的查询中缺少 where 子句

试试这个...

SELECT @viewname= viewname
FROM #T
WHERE ID = @N

我不明白 sql returns 组行,所以您的变量 @viewname 不能逐行赋值。默认情况下,您的@viewname 将被分配到 table T.

的最后一行