0

我正在使用动态 sql。这是我的 sp。我想检查 null。哪种方法是好的。

ALTER procedure [dbo].[proc_insertsample]
@pname varchar(10),
@rdatetime varchar(10),
@fromcountry int,
@fromoperatorid int

as
begin
declare @query nvarchar(4000)
declare @fromcountry2 varchar(10)
declare @fromoperatorid2 varchar(10)
set @fromcountry2 = CAST(@fromcountry as varchar(10))
set @fromcountry2 = isnull(@fromcountry2,0)
set @fromoperatorid2 = cast (@fromoperatorid as varchar(10))
set @fromoperatorid2 = isnull(@fromoperatorid2,0)
set @query = 'insert into sample1 (pname,rdatetime,fromcountry,fromoperatorid) values ('''+@pname+''','''+@rdatetime+''','''+@fromcountry2+''','''+@fromoperatorid2+''')'
print @query
end

或者

ALTER procedure [dbo].[proc_insertsample2]
@pname varchar(10),
@rdatetime varchar(10),
@fromcountry varchar(10),
@fromoperatorid varchar(10)

as
begin
declare @query nvarchar(4000)
set @fromcountry = ISNULL(@fromcountry,'')
set @fromoperatorid = ISNULL(@fromoperatorid,0)
set @query = 'insert into sample1 (pname,rdatetime,fromcountry,fromoperatorid) values ('''+@pname+''','''+@rdatetime+''','''+@fromcountry+''','''+@fromoperatorid+''')'
print @query
end

.我正在修改 sp。以前 para 是 int ,更改为 varchar。我可以为输入 para 设置一个值吗。我不想再次为 isnull 结果创建变量。我直接将 isnull 放入我正在打印和执行的动态字符串中。但是没有用。

4

2 回答 2

0

处理数据完整性问题的最佳方法是将 DEFAULT 和 NOT NULL 约束放在要插入的表中的字段上。这样,您就可以将验证逻辑从存储过程移到表本身中。

它还将帮助您在未来构建强大的数据库设计。

给你一个现实生活中的例子,你所做的就是每次在停车计时器中插入一枚大小合适的硬币并浪费时间时检查你的口袋,而不是仅仅将停车计时器中的硬币槽做得足够小只接受特定尺寸的硬币并拒绝未知硬币。

于 2013-04-29T12:03:54.697 回答
0

我不完全确定你在问什么,但是如果你可以通过为你想要默认值的参数提供默认值来定义存储过程中参数的默认值:

@fromcountry VARCHAR(10) = ''

所以你的第二个 sp 看起来像这样:

ALTER procedure [dbo].[proc_insertsample](@pname VARCHAR(10) = '',
                                          @rdatetime VARCHAR(10) = '',
                                          @fromcountry VARCHAR(10) = '',
                                          @fromoperatorid VARCHAR(10) = ''
AS
BEGIN
    DECLARE @query AS NVARCHAR(4000)

    SET @query = 'INSERT INTO sample1 (pname,rdatetime,fromcountry,fromoperatorid) VALUES ('''+@pname+''','''+@rdatetime+''','''+@fromcountry+''','''+@fromoperatorid+''')'
    PRINT @query
END

如果您proc_insertsample1不带参数调用,您的@query变量将如下所示:

INSERT INTO sample1 (pname,rdatetime,fromcountry,fromoperatorid)
VALUES ('', '', '', '', '')

或者,您可以将 ISNULL 检查放在动态 SQL 中:

SET @query = 'INSERT INTO sample1 (pname,rdatetime,fromcountry,fromoperatorid) VALUES (''' + @pname + ''',''' + @rdatetime + ''',''' + ISNULL(@fromcountry,'') + ''',''' + ISNULL(@fromoperatorid,'') + ''')'

在这种情况下,您的@query变量将(假设 pname 为“John”,rdatetime 为“10/01/2007”)如下所示:

INSERT INTO sample1 (pname,rdatetime,fromcountry,fromoperatorid)
VALUES ('John','10/01/2007','','')

这有帮助吗?

于 2013-04-29T01:42:23.667 回答