我的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
所以,我想写一个程序:
copied_id
,new Id
和new Name
。任何帮助表示赞赏!!
答案 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;