Хранимая процедура: как использовать столбец в качестве входных данных - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь создать простую хранимую процедуру для подсчета количества пустых записей в моей базе данных:

CREATE PROCEDURE dbo.cnt_empty 
    @col NVARCHAR(10)
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;

        SELECT COUNT(@col) AS cnt
        FROM dbo.mytable
        WHERE @col = ''

END
GO

EXECUTE dbo.cnt_empty @col = N'field1' -- nvarchar(10)

Я возвращаю 0 для всех проверенных столбцов. Что не так с этой процедурой?

Ответы [ 5 ]

4 голосов
/ 10 октября 2011

Ваша строка не оценивается как имя столбца, поэтому вы на самом деле выполняете "где 'field1' = ''"

Вам нужно сделать что-то вроде этого

set @sql = 'select @cnt = COUNT(*) from [' + @tableSchema + '].[' + @tableName +
    '] where [' + @columnName + '] is not null';
-- print @sql; --uncomment for debugging
exec sp_executesql @sql, N'@cnt bigint output', @cnt = @cnt output;

Посмотрите на http://blog.hoegaerden.be/2009/02/15/script-find-all-empty-columns-in-database/ для полного сценария.

2 голосов
/ 10 октября 2011

При этом ваш оператор SQL обрабатывает параметр как строку, а не как имя столбца.Взгляните на sp_executesql .Это поможет вам создать строку SQL и выполнить ее.

1 голос
/ 10 октября 2011

Взгляните на эту статью: http://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/

В основном используйте EXEC оператор или sp_executesql должен быть ваш выбор.

1 голос
/ 10 октября 2011

Что вы хотите сделать, так это объявить переменную типа @sql VARCHAR (500)

Тогда сделай

SET @sql = 'ВЫБЕРИТЕ СЧЕТЧИК (' + @ col + ') КАК ОТ НЕ dbo.mytable'

Тогда попробуйте использовать встроенный sp под названием sp_Executesql http://msdn.microsoft.com/en-us/library/ms188001.aspx

Это потому, что вы выбираете счетчик переменной, а не столбец.

1 голос
/ 10 октября 2011

вы сопоставляете @col (т. Е. 'Field1') с пустым (т. Е. '') В предложении where - это никогда не вернет строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...