查询数据库中的所有视图

时间:2015-01-16 20:08:35

标签: sql-server sql-server-2008

我希望返回一个视图名称和所有记录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

中选择*

2 个答案:

答案 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的最后一行。