Попробуйте, заменив два вхождения «Каталога» именем вашей таблицы.Это было успешно протестировано на SQL Server 2008 R2 Dev Edition в базе данных ReportServer по умолчанию.
DECLARE @Sql nvarchar(max)
SET @Sql = 'SELECT 0'
SELECT
@Sql = @Sql + '
+ CASE WHEN [' + [sys].[columns].[name] + '] IS NULL THEN 1 ELSE 0 END'
FROM [sys].[columns]
WHERE [sys].[columns].[object_id] = OBJECT_ID('Catalog')
AND [sys].[columns].is_nullable = 1
SET @Sql = @Sql + '
AS [NullValuesCount] FROM [Catalog]'
PRINT @Sql
EXEC sp_executesql @Sql
Обратите внимание, что этот подход подвержен атаке SQL-инъекции, если вы не можете доверять источнику столбцаимена (например, если конечные пользователи могут создавать столбцы с именами под своим контролем).