插入表中使用SQL Server 2008中的Array

Sae*_*eid 2 sql t-sql sql-server insert sql-server-2008

这是我的表:

电话:Id,MemberId,Number,PhoneType,IsDefault

我需要一个存储过程来获取一个数组numbers和一个memberIdas参数,并将所有这些插入到PhoneTable中.我不能一个接一个地传递数字我需要插入所有数字或者不能插入任何数字.我想通过数字作为列表以逗号分隔Nvarchar'0412589, 0425896, 04789652'我不得不提的MemberId是始终恒定,并通过参数传递,PhoneType始终不变='phone',并为数组的第一个数字IsDefault = 1为别人IsDefault = 0如何选择,从号码numbers和插入命令设置其他列?或者你有另一个建议传递数字?

Ari*_*ion 6

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

CREATE TYPE PhoneNumberType AS TABLE 
( number  VARCHAR(50));
GO
Run Code Online (Sandbox Code Playgroud)

然后你的程序将是这样的:

CREATE PROCEDURE dbo. usp_InsertPhoneNumbers
    @TVP PhoneNumberType READONLY
AS 
INSERT INTO Phone(number,....)
SELECT
    number,
    ....
FROM
    @TVP
Run Code Online (Sandbox Code Playgroud)

参考这里

编辑

它就像一个表一样工作,所以很容易做到这一点:

DECLARE @TVP PhoneNumberType

INSERT INTO @TVP
VALUES
    ('0412589'),('0425896'),('04789652')

EXEC usp_InsertPhoneNumbers @TVP
Run Code Online (Sandbox Code Playgroud)

或者如果你把它作为一个字符串,那么你需要拆分它.这是一个整洁的分裂功能:

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 
Run Code Online (Sandbox Code Playgroud)

你调用这样的程序:

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
Run Code Online (Sandbox Code Playgroud)