【问题标题】:Insert into different tables depending on parameter value根据参数值插入不同的表
【发布时间】:2015-08-25 10:18:34
【问题描述】:

我有一个这样的存储过程:

create procedure [dbo].[InsertInput]
(@ResourceTag int, @Element varchar(50), @PeriodID int, @BackPay varchar(50), @InputValue decimal(18,5), @UserID varchar(50), @Source varchar(50), @InputDate datetime, @SourceID int, @Comments varchar(200), @ProcessID int, @TableCode int, @ScopeID int = NULL Output)
as
begin

INSERT INTO 
[dbo].[Input]
([Resource Tag] ,[Element] ,[Period ID] ,[Back Pay], [Input Value], [User ID], [Source], [Input Date], [Source ID], [Comments], [Process ID])
Values(@ResourceTag, @Element, @PeriodID, @BackPay, @InputValue, @UserID, @Source, @InputDate, @SourceID, @Comments, @ProcessID)

set @ScopeID = (Select Scope_Identity())

end

现在我添加了参数@TableCode,根据这个值,上面的插入语句应该去不同的表。 例如, 如果@TableCode = 0,则插入 INTO [dbo].[Input]... 如果@TableCode = 1,则插入 INTO [dbo].[Input1]...

所以我尝试添加一个像这样 sn-p 的 CASE 语句:

INSERT INTO 
CASE WHEN @TableCode = 0 THEN
[dbo].[Input]
([Resource Tag] ,[Element] ,[Period ID] ,[Back Pay], [Input Value], [User ID], [Source], [Input Date], [Source ID], [Comments], [Process ID])
Values(@ResourceTag, @Element, @PeriodID, @BackPay, @InputValue, @UserID, @Source, @InputDate, @SourceID, @Comments, @ProcessID)

set @ScopeID = (Select Scope_Identity())

但我刚刚收到类似于“'CASE' 附近的语法不正确”的错误。

this 页面上,我没有看到将 CASE 与 INSERT 一起使用的示例,所以也许不可能?

我应该使用多个 if 语句吗? 如:

IF @TableCode = 0 
Begin
INSERT INTO [dbo].[Input]
([Resource Tag] ,[Element] ,[Period ID] ,[Back Pay], [Input Value], [User ID], [Source], [Input Date], [Source ID], [Comments], [Process ID])
Values(@ResourceTag, @Element, @PeriodID, @BackPay, @InputValue, @UserID, @Source, @InputDate, @SourceID, @Comments, @ProcessID)

set @ScopeID = (Select Scope_Identity())
end 

If @TableCode = 1...

【问题讨论】:

  • 问题是什么?
  • 不,你不能。您不能像这样将 case 语句与 insert 语句一起使用。如果你想使用你提到的 case 语句,那么你必须将你的 sql 语句转换为动态查询。
  • 你应该看看这篇文章。如果你不稍微改变它,你就会面临一个非常具有挑战性的性能问题。 sqlinthewild.co.za/index.php/2009/09/15/…

标签: sql-server


【解决方案1】:

CASE 语句根据条件返回值,不执行查询,因此不能用于控制 SQL 语句的执行流程。这就是为什么,这个错误。

如果变量只有 2 个值(或更少的值),就像示例中一样,请使用 if statement

IF @var=0
INSERT.... table1
ELSE IF @var=1
INSERT.... table2
ELSE
INSERT... table3

否则您可以使用动态 sql 并动态设置表名。请点击此链接:

how to set table name in dynamic sql query?

【讨论】:

    【解决方案2】:

    Case 不是流控制元素。如CASE msdn 页面中所述:

    CASE 表达式不能用于控制 Transact-SQL 语句、语句块、用户定义函数和存储过程的执行流程。

    您需要使用IF...ELSE来控制存储过程的流程。

    它是一个插入语句这一事实与这个问题无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2016-07-29
      相关资源
      最近更新 更多