我想选择存储过程的参数,然后在循环中检查每个参数是否为空。
我遇到的问题是,当我想在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
当我运行这个存储过程
时,我总是'失败'答案 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
。