Paas使用SP一次为单个参数赋值

时间:2016-11-03 10:42:19

标签: sql-server tsql

我创建了一个从Inventory_view_03表输入值和过滤信息的过程,并将这些数据插入Trn_note_header但过程正常运行。

当我输入一个值到输入时,如果我输入两个或更多,我不起作用,但不显示错误。

你能告诉我这是什么问题吗?

CREATE PROCEDURE insertrecord
@KITITEM Varchar(20) 
AS 
BEGIN 

DECLARE @LASTNO int
IF (@LASTNO IS NULL) OR (LEN(@LASTNO) > 0)
BEGIN
  SET @LASTNO= 0
END


SELECT @LASTNO=ISNUMERIC([Trn_number])from [dbo].[Trn_note_header]
SET @LASTNO=@LASTNO+1

insert into[dbo].[Trn_note_header]([Trn_number],[kit_number],[Supplier],[Season],[Pcs])
select @LASTNO,[trb_kit_desc],[shortname],[se_name],[Expr1] From[dbo].[Inventory_view_03]
WHERE trb_kit_desc IN(@KITITEM)

End

2 个答案:

答案 0 :(得分:0)

当你输入一个时,输入看起来像这样

trb_kit_desc IN('a')

当您输入两个或更多时,输入看起来像这样

 trb_kit_desc IN('a,b,c')

没有与您的查询匹配的值,这就是原因,它不起作用..

您可以像下面一样更改插入内容,即使在多个值的情况下也可以使用,您必须使用以下其中一个函数拆分这些值:https://sqlperformance.com/2012/07/t-sql-queries/split-strings

;with cte
as
(
select * from dbo.split_strings(@KITITEM,',')
)
insert into[dbo].[Trn_note_header]([Trn_number],[kit_number],[Supplier],[Season],[Pcs])
select @LASTNO,[trb_kit_desc],[shortname],[se_name],[Expr1] From[dbo].[Inventory_view_03]
WHERE trb_kit_desc IN(select item from cte)

答案 1 :(得分:0)

您可以构建动态T-SQL语句并执行它。例如:

  • 您可以将语句构建为字符串,如下所示:

    DECLARE @DynamicSQLStatement NVARCHAR(MAX);
    
    SET @DynamicSQLStatement = 'insert into[dbo].[Trn_note_header]([Trn_number],[kit_number],[Supplier],[Season],[Pcs])
    select ' + CAST(@LASTNO AS VARCHAR(12)) + ',[trb_kit_desc],[shortname],[se_name],[Expr1] From[dbo].[Inventory_view_03]
    WHERE trb_kit_desc IN(''' + REPLACE(@KITITEM, ',', ''',''')  +''')';
    
    EXEC sp_executesql @DynamicSQLStatement
    
  • 您可以将变量传递给sp_executesql过程,如下所示:

    DECLARE @DynamicSQLStatement NVARCHAR(MAX);
    
    SET @KITITEM = REPLACE(@KITITEM, ',', ''',''');
    
    SET @DynamicSQLStatement = 'insert into[dbo].[Trn_note_header]([Trn_number],[kit_number],[Supplier],[Season],[Pcs])
    select ' + CAST(@LASTNO AS VARCHAR(12)) + ',[trb_kit_desc],[shortname],[se_name],[Expr1] From[dbo].[Inventory_view_03]
    WHERE trb_kit_desc IN(''@KITITEM'')';
    
    EXEC sp_executesql @DynamicSQLStatementN, '@KITITEM Varchar(20), @LASTNO INT', @KITITEM, @LASTNO;
    

无论如何,这是另类,但如果我是你,我会使用@TheGameiswar的夹板值的解决方案。