重复行并返回一个表

时间:2013-10-03 13:33:50

标签: sql-server stored-procedures

我的C#中有一个字符串数组(ID)。

我想将它发送到sql-server中的一个过程并复制它们在数组中找到的所有行(但是让它们成为新的Id和名称)。

然后我想插入:copied_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 Idnew Name
  4. 任何帮助表示赞赏!!

1 个答案:

答案 0 :(得分:1)

像@FreshPrinceOfSO所说,如果你可以完全避免使用游标,请不要使用游标。像下面这样的东西应该工作(我无法测试没有实际数据)。我使用你的NEWID()想法来生成新的id,但我认为这不是一个好主意...... NEWID用于guids,而不是3个字符的id。从NEWID中只收取三个字符时,无法保证唯一性。您应该使用整数(IDENTITY值)作为唯一ID。

;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;