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

J'ai un curseur qui parcourt toutes les vues SQL dans un schéma particulier pour vérifier qu'elles continuent de fonctionner, certaines sont liées au reporting et d'autres utilisées comme source de données d'application dans ProSolution.

L'une de ces vues est nommée UnmarkedRegister (aujourd'hui) les crochets utilisés pour la différencier d'une vue similaire, celle-ci est utilisée dans une application pour générer des données d'affichage.

Pendant que la requête s'exécute comme prévu, renvoyant les données correctes - le curseur renvoie une erreur

Msg 208, niveau 16, état 1, ligne 1
Nom d'objet non valide 'V_WFC_UnmarkedRegister'

Et je me demande pourquoi la section entre crochets est omise dans la section EXEC (SQL) du curseur?

12
JonTout 23 mai 2018 à 16:03

3 réponses

Meilleure réponse

Utilisez {{ X0}}:

Set @SQL = 'SELECT TOP 10 * FROM ' + QUOTENAME(@TableName);
18
Gordon Linoff 23 mai 2018 à 13:05

Parce que les crochets identifient généralement un appel de fonction

Changer cette ligne:

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

À cela devrait le réparer:

Set @SQL = 'SELECT TOP 10 * FROM [' + @TableName + ']'
3
Brad 23 mai 2018 à 13:05

Je déteste vraiment les curseurs et il n'y a aucun besoin de curseur ici. Vous pouvez grandement simplifier ce code de plusieurs manières. J'utilise d'abord sys.views au lieu des vues INFORMATION_SCHEMA. Et puis j'utilise sql pour construire une chaîne SQL dynamique au lieu d'un curseur. Regardez comme cela peut être simple.

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
5
Sean Lange 23 mai 2018 à 14:50