Этот запрос требует динамического SQL? SQL Server - PullRequest
0 голосов
/ 30 сентября 2011

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

Проблема, с которой я сталкиваюсь, заключается в том, что когда я хочу оценить переменную вЕсли заявление, оно не оценивается правильно.Я хочу оценить каждый параметр, который я сохранил в табличной переменной.Я не знаю синтаксис для этого ... или, возможно, это даже невозможно?Требуется ли для этого динамический SQL?Если это так, то при выполнении динамического sql значение переменной будет выходить за рамки, так как мне с этим справиться?

Я проверил все, пока работает оператор IF.

CREATE PROCEDURE dbo.UpdateBank
(
    @BankKey [smallint] = NULL,
    @Bank [varchar] (30) = NULL,
    @BankCode [char] (4) = NULL,
    @MasterBankCode [char] = NULL,
    @Bin [char] (6) = NULL,
    @WebSite [varchar] (50) = NULL,
    @isActive [bit] = NULL,
    @CreateDate [smalldatetime] = NULL
)
AS
SET NOCOUNT ON
SET ANSI_NULLS OFF

DECLARE @MaxRow TINYINT, @Count TINYINT
DECLARE @SPName VARCHAR (128), @CurrentRow TINYINT
SET @SPName = OBJECT_NAME(@@PROCID) -- SP self-reference to find its current name

DECLARE @SPParametersList TABLE (ID INT Identity(1,1) Primary Key,
                                 ParameterName NVARCHAR (128), 
                                 DataType NVARCHAR (128),
                                 ParameterMode NVARCHAR (10))

CREATE TABLE #TempExec(ID INT Identity(1,1) Primary Key,
                       Num BIT)


    INSERT INTO @SPParametersList (ParameterName, Datatype, ParameterMode)
        SELECT PARAMETER_NAME,DATA_TYPE,PARAMETER_MODE
        FROM INFORMATION_SCHEMA.PARAMETERS
        WHERE SPECIFIC_NAME = @SPName


    SET @CurrentRow = 1
    SELECT @MaxRow = ISNULL(MAX(ID),0) FROM @SPParametersList

    WHILE @CurrentRow <= @MaxRow
    BEGIN
        IF ((SELECT ParameterName FROM @SPParametersList WHERE ID = @CurrentRow) <> NULL)
        BEGIN
            SELECT 'Success' 
            SET @Count = @Count + 1 
        END
            SELECT 'Fail' 
        SET @CurrentRow = @CurrentRow + 1 

    END 

    SELECT @Count 

Я всегда получаю 'Fail', когда запускаю этот сохраненный процесс

Ответы [ 4 ]

0 голосов
/ 30 сентября 2011

(1)"Я всегда получаю 'Fail' при запуске этого сохраненного процесса": вы забыли ветку ELSE

IF ((SELECT ParameterName FROM @SPParametersList WHERE ID = @CurrentRow) /*<>*/ IS NOT NULL)
BEGIN
    SELECT 'Success' 
    SET @Count = @Count + 1 
END
ELSE -- << here
BEGIN
    SELECT 'Fail' 
END
SET @CurrentRow = @CurrentRow + 1

(2) Для подсчета всех not null параметров:

SELECT  @Count=COUNT(*)
FROM    @SPParametersList a
WHERE   a.ParameterName IS NOT NULL 

Для подсчета всех null параметров:

SELECT  @Count=COUNT(*)
FROM    @SPParametersList a
WHERE   a.ParameterName IS NULL 

Примечание: если вы хотите проверитьдля NULL / NOT NULL вы должны использовать оператор column/@variable IS [NOT] NULL, а SET ANSI_NULLS должно быть включено: SET ANSI_NULLS ON.

0 голосов
/ 30 сентября 2011

Я подозреваю, что это пример запроса, который можно переписать без использования циклов / курсоров (большинство sql в моем опыте ...)

Дает ли приведенный ниже запрос желаемые результаты??

with temp as
(
    SELECT '@BankKey' as ParamName
        UNION
        SELECT '@Bank'
)

SELECT COUNT(*) as myCount
        FROM INFORMATION_SCHEMA.PARAMETERS as isp
        LEFT JOIN temp as t
        ON t.ParamName = isp.PARAMETER_NAME
        WHERE SPECIFIC_NAME = @SPName AND t.ParamName is null

Вы должны стараться избегать как можно большего количества циклов / курсоров.SQL Server (и большинство СУБД в целом) превосходны в выполнении операций на основе множеств и ужасны в выполнении операций на основе строк (циклы / курсоры).

0 голосов
/ 30 сентября 2011

Возможно, проблема в <> NULL, который должен

 IF EXISTS(SELECT ParameterName FROM @SPParametersList WHERE ID = @CurrentRow) 

, но я не уверен, чего вы хотите достичь с помощью этого куска кода ...

0 голосов
/ 30 сентября 2011

Измени свою линию:

IF ((SELECT ParameterName FROM @SPParametersList WHERE ID = @CurrentRow) <> NULL)

до

IF ((SELECT ParameterName FROM @SPParametersList WHERE ID = @CurrentRow) IS NOT NULL)

Вам также нужно инициализировать переменную @Count равной 0:

    SET @Count = 0
    SET @CurrentRow = 1
    SELECT @MaxRow = ISNULL(MAX(ID),0) FROM @SPParametersList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...