Как передать имя таблицы и имя столбца динамически c в SQL - PullRequest
0 голосов
/ 18 апреля 2020

Я пытался передать имя таблицы и имя столбца динамически c, это как часть процесса SSIS. Я пытаюсь выполнить эту хранимую процедуру ниже.

CREATE PROCEDURE [lnd].[Get_ANCNotullColumn]
    (@PassedTableName AS NVarchar(255),
     @PassedColumnName AS NVARCHAR(100)) 
AS
BEGIN  
    DECLARE @ActualTableName AS NVarchar(255)

    SELECT @ActualTableName = QUOTENAME( TABLE_NAME )
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @PassedTableName

    DECLARE @sql AS NVARCHAR(MAX)

    SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';'

    DECLARE @final AS NVARCHAR(MAX)

    SELECT @final = @sql + 'WHERE ' + @PassedColumnName + ' IS NULL  OR ' + @PassedColumnName + '='''

    EXEC(@SQL)
END

При выполнении этого я НЕ получаю считать как результат, вместо этого я получаю успех выполнения.

EXEC [lnd].[Get_ANCNotullColumn] 'lnd.ANC_LND_ItemOverride', 'comments' 

Мне нужно получить количество в качестве вывода.

Также мой простой прямой запрос выглядит так:

SELECT COUNT(*) 
FROM lnd.ANC_LND_ItemOverride  
WHERE Comments IS NULL OR Comments = '' -- 3 is the output

1 Ответ

0 голосов
/ 18 апреля 2020

Я думаю, что вам может понадобиться изменить передачу значений и значения конкатенации.

из этого оператора необходимо удалить точку с запятой, так как она выдаст ошибку

SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';'

При передаче пустых значений необходимы дополнительные кавычки

SELECT @final = @sql + 'WHERE ' + @PassedColumnName + ' IS NULL  OR ' + @PassedColumnName + '= '''''

Во время выполнения I полагаю, что вы хотели выполнить final вместо SQL

Я думаю, что ниже должен дать ваш вывод:

CREATE PROC [lnd].[Get_ANCNotullColumn]( @PassedTableName as NVarchar(255),@PassedColumnName AS 
     NVARCHAR(100)) 
 AS
 BEGIN
 DECLARE @ActualTableName AS NVarchar(255)

SELECT @ActualTableName = QUOTENAME( TABLE_NAME )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @PassedTableName

DECLARE @sql AS NVARCHAR(MAX)
SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ' '

DECLARE @final AS NVARCHAR(MAX)
SELECT @final = @sql + 'WHERE ' + @PassedColumnName + ' IS NULL  OR ' + @PassedColumnName + '='''''

EXEC(@final)
END
...