Причина, по которой ваше утверждение не соответствовало этому, объясняется следующим:
'...cast(' + @Tablename + N' as varchar (100))...'
Это будет скрыто в SQL
CAST(YourTableName AS varchar(100))
Что, как вы, вероятно, видите, не 'не имеет смысла.Вы хотите, чтобы YourTableName
был заключен в одинарные кавычки и, вероятно, как nvarchar
.Вы можете добиться этого, выполнив это вместо этого:
'...cast(N' + QUOTENAME(@Tablename,N'''') + N' as nvarchar (100))...'
Вместо того, чтобы использовать курсор, вы могли бы намного легче "упростить" построение этого в одном выражении и использовать PRINT
для устранения неполадок.Это должно работать для вашей цели, но я не могу проверить, поскольку у меня нет доступа к вашей системе:
CREATE TABLE #MyTable(TableName sysname,
Qty int);
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'INSERT INTO #MyTable(TableName, Qty)' + NCHAR(13) + NCHAR(10) +
STUFF((SELECT N'UNION ALL' + NCHAR(13) + NCHAR(10) +
N'SELECT N' + QUOTENAME([name],N'''') + N',' + NCHAR(13) + NCHAR(10) +
N' (SELECT COUNT(*) FROM dbo.' + QUOTENAME([name]) + N')'
FROM sys.sysobjects --I assume this should have been sys
WHERE [name] LIKE N'%SupplierName%'
AND crdate = '20190320'
FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,11,N'') + N';'
--PRINT @SQL --Your debugging best friend
EXEC sp_executesql @SQL;