Ответ 1
Использовать quotename()
:
Set @SQL = 'SELECT TOP 10 * FROM ' + QUOTENAME(@TableName);
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) курсора?
Использовать quotename()
:
Set @SQL = 'SELECT TOP 10 * FROM ' + QUOTENAME(@TableName);
Я действительно ненавижу курсоры, и здесь нет необходимости в курсоре. Вы можете значительно упростить этот код несколькими способами. Сначала я использую 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
Поскольку скобки обычно идентифицируют вызов функции
изменение этой строки:
Set @SQL = 'SELECT TOP 10 * FROM ' + @TableName
к этому следует исправить это:
Set @SQL = 'SELECT TOP 10 * FROM [' + @TableName + ']'