下面是一个存储过程:
目的是如果传递三个参数,第一个是表明,第二个是id,第三个是name。
如果表中还没有name字段与@name相同的,那么插入一条新数据。
CREATE PROCEDURE [dbo].[TESTXX]
(
@tb char(4),
@id int,
@nm nvarchar(10)
)
AS
DECLARE @temp int;
    DECLARE @sql      nvarchar(1000);
DECLARE @id2 varchar(10);
DECLARE @nm2 nvarchar(10);
set @id2 = @id
set @nm2 = @nm
set @sql = '
BEGIN
SELECT '+@temp+' = id WHERE name='''+@nm2+''';
IF('+@temp+' IS NULL)
BEGIN
INSERT INTO '+@tb+'(id,name) VALUES('+@id2+', '''+@tb+''');
END
END'

EXEC(@sql)
我有两个问题:
1.DECLARE @temp int;这个时候执行到SELECT '+@temp+' = id WHERE name='''+@nm2+''';直接说nvarchar转化为int的时候失败,只能把DECLARE @temp int改为DECLARE @temp nvachar(10)2.貌似执行到IF之前就结束了,不在执行,也没有错误,这是为什么3.IF('+@temp+' IS NULL)这个貌似也有问题小弟第一次用存储过程,这个问题搞了2天了,额,求助各位大侠

解决方案 »

  1.   

    不好意思上面描述的不好,重新描述一遍:
    有一个表有两个字段(id int, name varchar(10))
    这个存储过程有三个参数:参数1:表名  参数2:要插入的id  参数3:要插入的name
    需要的效果是,如果表中没有某一项的name字段和参数3相同,那么使用参数2,3插入一条新数据。
    CREATE PROCEDURE [dbo].[TESTXX]
    (
    @tb char(4),
    @id int,
    @nm nvarchar(10)
    )
    AS
    DECLARE @temp int;
        DECLARE @sql      nvarchar(1000);
    DECLARE @id2 varchar(10);
    DECLARE @nm2 nvarchar(10);
    set @id2 = @id
    set @nm2 = @nm
    set @sql = '
    BEGIN
    SELECT '+@temp+' = id FROM '+@tb+' WHERE name='''+@nm2+''';
    IF('+@temp+' IS NULL)
    BEGIN
    INSERT INTO '+@tb+'(id,name) VALUES('+@id2+', '''+@nm2+''');
    END
    END'

    EXEC(@sql)我有3个问题:
    1.DECLARE @temp int;这个时候执行到SELECT '+@temp+' = id FROM '+@tb+' WHERE name='''+@nm2+'''直接说SELECT ' 转换成数据类型 int 时失败,只能把DECLARE @temp int改为DECLARE @temp nvachar(10)2.貌似执行到IF之前就结束了,不在执行,也没有错误,这是为什么3.IF('+@temp+' IS NULL)这个貌似也有问题小弟第一次用存储过程,这个问题搞了2天了,额,求助各位大侠 
      

  2.   

    1、@temp转换为int需要用cast或convert转换,cast(@temp as varchar(10))或convert(varchar(10),@temp)
    2、由于转换失败,后面的都不执行
      

  3.   


    有点不明白,因为@temp本来就是int的,你说的cast(@temp as varchar(10))或convert(varchar(10),@temp)不是转化为varchar了吗SELECT '+@temp+' = id FROM '+@tb+' WHERE name='''+@nm2+''';怎么改,能给点建议吗?
      

  4.   

    你要不就把 DECLARE @temp 和 @temp 的使用一起放到动态SQL里面去.  要不就拆分成两段动态SQL, 把第一个SQL的结果赋予当前的一个变量, 作出判定, 然后执行第二个 SQL.
      

  5.   

    你去看看基础的书吧,SQLSERVER的数值类型不能隐形转换成字符串,不是加''就可以转换的,