这个查询是否需要动态sql? SQL Server

时间:2011-09-29 20:42:36

标签: sql sql-server variables dynamic

我想选择存储过程的参数,然后在循环中检查每个参数是否为空。

我遇到的问题是,当我想在IF语句中评估变量时,它没有被正确评估。我想评估我存储在表变量中的每个参数。我不知道这个的语法......或者甚至可能不可能? 这需要动态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 

当我运行这个存储过程

时,我总是'失败'

4 个答案:

答案 0 :(得分:0)

更改行:

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

答案 1 :(得分:0)

我怀疑这是一个可以在不使用循环/游标的情况下重写的查询示例(根据我的经验,大多数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(以及大多数DBMS)在执行基于集合的操作方面非常出色,并且在执行基于行的操作(循环/游标)时非常糟糕。

答案 2 :(得分:0)

可能问题出在&lt;&gt;应该

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

但我不确定你想用这段代码实现什么......

答案 3 :(得分:0)

(1)“当我运行此存储过程时,我总是'失败'”:您忘记了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 must be ON: SET ANSI_NULLS ON