【问题标题】:Insert results of a table into stored procedure as parameters将表的结果作为参数插入存储过程
【发布时间】:2019-11-27 19:29:32
【问题描述】:

我有一个将值插入表的存储过程。 假设它的名称是usp_InsertTableA,参数为@ID intName varchar(100)

我需要从另一个存储过程中多次调用此存储过程。我正在考虑将此存储过程称为如下所示

exp usp_InsertTableA
select ID, Name from #tempTable

这是否可以在 SQL Server 中使用表的值执行并将其发送到存储过程中?

【问题讨论】:

  • 为什么不在第二个过程中插入呢?微软鼓励你在 sql server 中所做的一切的整个思考方法是有一个基于集合的操作。如果您有 100 行由一个选择查询生成并且您必须将它们插入到一个表中,那么您不会调用存储过程 100 次,您将运行一个一次性插入所有 100 行的插入。这也许可以采取表参数的形式到执行插入的 sp,以便您传递和插入 100 行
  • 我的意思是像这样 codingsight.com/… - 不像你有它(你必须调用 100 次才能插入 100 行的过程)
  • 你想做的当然是可能的。它需要一个循环(如游标)来遍历临时表中的每一行。这并不意味着这是一个好主意,实际上这是一个坏主意。循环非常低效,一遍又一遍地调用相同的过程会削弱你的服务器。

标签: sql sql-server sql-server-2017


【解决方案1】:

存储过程可以使用表类型参数。

CREATE TYPE [dbo].[udt_MyCustomTable] AS TABLE(
    [id] [int] NOT NULL,
    [name] [nvarchar](100) NOT NULL
)
GO

然后你的存储过程将是:

CREATE PROC [dbo].[usp_InsertTableA]
 (
    @myCustomTable udt_MyCustomTable READONLY
 )
 AS
BEGIN
  -- Your code goes in here
END

【讨论】:

    【解决方案2】:

    这是否可以在 SQL Server 中使用表的值执行并将其发送到存储过程中?

    不,不是您拥有的存储过程。有一些丑陋的黑客可以让它发生,但这不是你应该在 T-SQL 中做事的方式。您在 SQL Server 中所做的一切都应该针对一组行进行优化,而不是单行/逐行

    实际上,这意味着,如果您有这样的查询,它会产生 100 行:

    select ID, Name from #tempTable
    

    您可以将这 100 行传递给您的插入过程并在一次操作中插入它们:

    --expanding on sam's advice
    
    --create a type 
    CREATE TYPE [dbo].[udt_MyCustomTable] AS TABLE(
        [id] [int] NOT NULL,
        [name] [nvarchar](100) NOT NULL
    )
    
    
    --your insert procedure 
    CREATE PROC [dbo].[usp_InsertTableA]
     (
        @myCustomTable udt_MyCustomTable READONLY
     )
     AS
    BEGIN
      INSERT INTO TableA(idcolumn, namecolumn)
      SELECT is, name FROM @myCustomTable
    END
    

    现在在您想要插入 100 行的主 sp 中:

    @DECLARE tmpVar udt_MyCustomTable;
    
    --put 100 rows into table variable
    INSERT INTO tmpVar(id,name)
    select ID, Name from #tempTable
    
    --pass 100 rows in variable to SP to insert all at once
    EXECUTE usp_InsertTableA tmpVar
    

    【讨论】:

      【解决方案3】:
        DECLARE @ID INT, @Name VARCHAR(255)
        SELECT @ID = ID, @Name=Name FROM #tempTable -- assumes one record in the table.
        EXEC dbo.usp_insertdata @id, @Name
      

      【讨论】:

      • 当然临时表中不止1行。他们为什么要创建一个只有一行的临时表?如果只有一个行,他们为什么要问这个问题是否需要它来处理多行?
      • Seam Lange:从问题中你怎么知道临时表中有不止一行?
      • 你怎么可能读到这个问题并认为它只有一行?他们清楚直接地询问他们如何调用临时表中每一行的过程。
      猜你喜欢
      • 1970-01-01
      • 2020-01-26
      • 2018-07-05
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2012-12-15
      相关资源
      最近更新 更多