0

C# に文字列 (ID) の配列があります。

私はそれをsql-serverのプロシージャに送信し、それらのIDが配列で見つかったすべての行を複製したい(ただし、それらに新しいIDと名前を付けさせてください)。

次に、copyed_id、新しい id、新しい名前を挿入して、それを c# に返します。

例えば:

Ads_Table

adId   |    Name    |   Status    |  Date
------------------------------------------
 2g3   |    abc     |     3       |  03.10
 2g4   |    xyz     |     4       |  04.10
 2g5   |    123     |     4       |  03.10

私が持っていると仮定します:

string[] adsIds = new string();
adsIds[0] = "2g3";
adsIds[1] = "2g5";

NewAdsDetails newAds = Duplicate_Ads(adsIds); // run the prosedure

テーブルは次のようになります。

Ads_Table

adId   |    Name    |   Status    |  Date
------------------------------------------
 2g3   |    abc     |     3       |  03.10
 2g4   |    xyz     |     4       |  04.10
 2g5   |    123     |     4       |  03.10
 gsd   |  abc_gsd   |     3       |  03.10 // this ad was copied
 hfs   |  123_hfs   |     4       |  03.10 // this ad was copied

新しい ID は NEWID() によって生成され、名前はコピーされた adId の名前 + '_' + 新しい広告の newId によって生成されました。

したがって、返されるテーブルには次が含まれます。

 copiedId, newAdId, newName
 --------------------------
 [2g3, gsd, abc_gsd;
  2g5, hfs, 123_hfs]

私は手順を作成しようとしました:

CREATE PROCEDURE [dbo].[Duplicate_Ads] @adsIds table(adId varchar(20))
AS
BEGIN
    DECLARE @newAdsIds table(adId varchar(20))
    DECLARE @newAdId NVARCHAR(100);


    DECLARE @Ad_cursor CURSOR;  
    SET @Ad_cursor = CURSOR FOR
    SELECT * FROM Ads_Table where adid in @AdsIds

    OPEN @Ad_cursor;
    FETCH NEXT FROM @Ad_cursor INTO @newAdsIds ;

    WHILE @@FETCH_STATUS = 0   
        BEGIN
           BEGIN
             @newAdId = NEWID();
             INSERT INTO sensplit_ads values(@newAdId, Name + '_' + @newAdId, Status, date);
           END

           FETCH NEXT FROM @Ad_cursor INTO adId, @newAdId, Name + '_' + @newAdId;

       END

       CLOSE @Ad_cursor;
       DEALLOCATE @Ad_cursor;
       Return @newAdsIds;
END

繰り返しますが、プロシージャを書きたいと思います。

  1. 文字列の配列を取得します。
  2. ID が指定された配列で見つかったすべての広告を複製しますが、新しく記録された新しい ID と新しい名前を生成します。
  3. copied_idnew Id、およびのテーブルを返しますnew Name

どんな助けでも大歓迎です!!

4

1 に答える 1

1

@FreshPrinceOfSOが言ったように、カーソルを回避できる場合はカーソルを使用しないでください。以下のようなものが動作するはずです (実際のデータなしではテストできません)。NEWID() のアイデアを使用して新しい ID を生成しましたが、それは良い考えではないと思います... NEWID は GUID 用であり、3 文字の ID 用ではありません。NEWID から 3 文字のみを取得する場合、一意性は保証されません。一意の ID として整数 (IDENTITY 値) を使用する必要があります。

;WITH NewAds as (
    SELECT  a1.adId AS CopiedId
            , a1.Name AS CopiedName
            , RIGHT(CAST(NEWID() AS VARCHAR(36)), 3) AS newAdId
    FROM    Ads_Table a1
            JOIN @AdsIds a2 ON a1.adId = a2.adId
)
SELECT  CopiedId, newAdId, CopiedName + '_' + newAdId AS [newName]
FROM    NewAds;
于 2013-10-03T14:15:47.180 に答える