2

这是我的桌子:

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

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

4

3 回答 3

6

您可以使用表值参数。因此,如果您有这样的类型:

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

参考这里

编辑

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

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
于 2012-05-10T07:03:59.577 回答
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)
于 2012-05-10T07:13:25.523 回答
0

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

参考:如何将数据表传递给sp

于 2012-05-10T07:04:43.260 回答