Просмотр 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 (Today) скобками, используемыми для того, чтобы отличать его от a с аналогичным видом, этот используется в приложении для управления отображаемыми данными.

Пока запрос выполняется так, как ожидалось, возвращает правильные данные - курсор возвращает ошибку

Msg 208, уровень 16, состояние 1, строка 1
Недопустимое имя объекта 'V_WFC_UnmarkedRegister'

и мне интересно, почему раздел в скобках опущен в разделе EXEC (SQL) курсора?

Ответ 1

Использовать quotename():

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

Ответ 2

Я действительно ненавижу курсоры, и здесь нет необходимости в курсоре. Вы можете значительно упростить этот код несколькими способами. Сначала я использую 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

Ответ 3

Поскольку скобки обычно идентифицируют вызов функции

изменение этой строки:

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

к этому следует исправить это:

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