2

これは私のテーブルです:

電話: Id、MemberId、Number、PhoneType、IsDefault

numbersとの配列を引数として取得し、それらすべてをテーブルmemberIdに挿入するには、ストアド プロシージャが必要です。Phone番号を 1 つずつ渡すことはできません。番号をすべて挿入するか、まったく挿入しないかのいずれかです。私が言及しなければならないNvarcharようなコンマで区切られたリストとして数字を渡すと思います常に定数であり、常に定数であり、他の配列の最初の数字に対しては、挿入コマンドで数字を選択して他の列を設定するにはどうすればよいですか? または、数値の配列を渡す別の提案がありますか?'0412589, 0425896, 04789652'MemberIdPhoneType='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

または、1 つの文字列として持っている場合は、分割する必要があります。これはきちんとした分割関数です:

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 に答える