SQL Server视图 - 错误的命名约定?

时间:2018-05-23 13:03:58

标签: sql sql-server

DECLARE @TableName AS VARCHAR(250);
DECLARE @SQL AS VARCHAR(500);
DECLARE @ViewCheck as CURSOR;

SET @ViewCheck = CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'VIEW' AND TABLE_NAME LIKE 'V_WFC%'

OPEN @ViewCheck

FETCH NEXT FROM @ViewCheck INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN

Set @SQL = 'SELECT TOP 10 * FROM ' + @TableName 

PRINT(@SQL)
EXEC(@SQL)

FETCH NEXT FROM @ViewCheck INTO @TableName;
END

CLOSE @ViewCheck

我有一个光标,它贯穿特定模式中的所有SQL视图,以便检查它们是否继续运行,有些与报告有关,有些则用作ProSolution中的应用程序数据源。

其中一个视图名为 UnmarkedRegister(今天),用于将其与类似视图区分开来的括号,此视图用于驱动显示数据。

当查询按预期运行时,返回正确的数据 - 游标返回错误

  

Msg 208,Level 16,State 1,Line 1
  无效的对象名称' V_WFC_UnmarkedRegister'

我想知道为什么在光标的EXEC(SQL)部分中省略了括号内的部分?

3 个答案:

答案 0 :(得分:18)

使用quotename()

Set @SQL = 'SELECT TOP 10 * FROM ' + QUOTENAME(@TableName);

答案 1 :(得分:5)

我真的讨厌游标,根本不需要光标。您可以通过几种方式大大简化此代码。首先,我使用sys.views而不是INFORMATION_SCHEMA视图。然后我使用sql来构建动态sql字符串而不是游标。看看这有多简单。

declare @SQL nvarchar(max) = '';

select @SQL = @SQL + 'select top 10 * from ' + QUOTENAME(v.name) + '; select ''('' + convert(varchar(2), @@ROWCOUNT) + '' rows affected'';'
from sys.views v
where v.name LIKE 'V_WFC%'

print @SQL
exec sp_executesql @SQL

答案 2 :(得分:3)

因为括号通常标识函数调用

更改此行:

var _ fs.Node = (*Dir)(nil)

这应该解决它:

Set @SQL = 'SELECT TOP 10 * FROM ' + @TableName