【问题标题】:Insert into Table use Array in SQL Server 2008在 SQL Server 2008 中插入表使用数组
【发布时间】:2012-05-10 06:51:55
【问题描述】:

这是我的桌子:

电话:Id、MemberId、号码、PhoneType、IsDefault

我需要一个存储过程来获取numbersmemberId 的数组作为参数并将它们全部插入Phone 表。我不能一个一个地传递数字,我需要插入所有数字或一个都不插入。我认为将数字作为逗号分隔的列表传递Nvarchar 就像'0412589, 0425896, 04789652' 我必须提到MemberId 始终是常量并通过参数传递,PhoneType 始终是常量='phone',并且对于数组的第一个数字@987654329 @ for others IsDefault = 0 如何从numbers 中选择数字并在插入命令中设置其他列?或者您有其他建议来传递数字数组?

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql insert


    【解决方案1】:

    您可以使用表值参数。所以如果你有这样的类型:

    CREATE TYPE PhoneNumberType AS TABLE 
    ( number  VARCHAR(50));
    GO
    

    那么你的程序会是这样的:

    CREATE PROCEDURE dbo. usp_InsertPhoneNumbers
        @TVP PhoneNumberType READONLY
    AS 
    INSERT INTO Phone(number,....)
    SELECT
        number,
        ....
    FROM
        @TVP
    

    参考here

    编辑

    它就像一张桌子一样工作,所以很容易做到这一点:

    DECLARE @TVP PhoneNumberType
    
    INSERT INTO @TVP
    VALUES
        ('0412589'),('0425896'),('04789652')
    
    EXEC usp_InsertPhoneNumbers @TVP
    

    或者,如果您将其作为一个字符串,则需要将其拆分。这是一个简洁的拆分函数:

    CREATE FUNCTION dbo.Split (@s varchar(512),@sep char(1))
    RETURNS table
    AS
    RETURN (
        WITH Pieces(pn, start, stop) AS (
          SELECT 1, 1, CHARINDEX(@sep, @s)
          UNION ALL
          SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
          FROM Pieces
          WHERE stop > 0
        )
        SELECT pn,
          SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
        FROM Pieces
      )
    GO 
    

    然后你像这样调用这个过程:

    DECLARE @TVP PhoneNumberType
    DECLARE @textToSplit VARCHAR(512)='0412589, 0425896, 04789652'
    INSERT INTO @TVP
    SELECT
        split.s
    FROM
        dbo.Split(@textToSplit,',') AS split
    
    EXEC usp_InsertPhoneNumbers @TVP
    

    【讨论】:

    • 这看起来很棒,但我不明白如何用numbers NVarchar 参数填充@TVP
    【解决方案2】:

    您可以将 XML 参数传递给您的存储过程。

    您将传入一个 XML,例如:

    <phones>
     <phone>
      <memberid>12</memberid>
      <number>123456789</number>
      <type>Landline</type>
     </phone>
     <phone>
      <memberid>12</memberid>
      <number>987654321</number>
      <type>Mobile</type>
     </phone>
    </phones>
    

    到这样的存储过程:

    CREATE PROCEDURE dbo.stp_InsertPhoneNumbers
       @numbersXML xml
    AS
    
    INSERT INTO Phone(memberid, number, type)
    SELECT
       List.Id.query('memberid').value('.', 'int') as memberid,
       List.Id.query('number').value('.', 'varchar(50)') as number,
       List.Id.query('type').value('.', 'varchar(50)') as type
    FROM @numbersXML.nodes('/phones/phone') as List(Id)
    

    【讨论】:

      【解决方案3】:

      在存储过程中传递 xml 或数据表。可以在sql server 2008中传递数据表。

      Refer : How to pass data table to sp

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2011-05-06
        相关资源
        最近更新 更多