查询数据库中的所有视图
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.
的最后一行
我正在寻找 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.
的最后一行