2009-07-09 14 views
60

मैं परिणामस्वरूप एक संग्रहीत प्रक्रिया (SQL सर्वर 2005) में अद्यतन क्वेरी द्वारा प्रभावित पंक्तियों की संख्या कैसे प्राप्त कर सकता हूं। जैसेअद्यतन विवरणों से प्रभावित पंक्तियों की वापसी संख्या

CREATE PROCEDURE UpdateTables 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    UPDATE Table1 Set Column = 0 WHERE Column IS NULL 
    UPDATE Table2 Set Column = 0 WHERE Column IS NULL 
    UPDATE Table3 Set Column = 0 WHERE Column IS NULL 
    UPDATE Table4 Set Column = 0 WHERE Column IS NULL 
END 

फिर लौट:

Table1 Table2 Table3 Table4 
32  45  0   3 

उत्तर

85
CREATE PROCEDURE UpdateTables 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    DECLARE @RowCount1 INTEGER 
    DECLARE @RowCount2 INTEGER 
    DECLARE @RowCount3 INTEGER 
    DECLARE @RowCount4 INTEGER 

    UPDATE Table1 Set Column = 0 WHERE Column IS NULL 
    SELECT @RowCount1 = @@ROWCOUNT 
    UPDATE Table2 Set Column = 0 WHERE Column IS NULL 
    SELECT @RowCount2 = @@ROWCOUNT 
    UPDATE Table3 Set Column = 0 WHERE Column IS NULL 
    SELECT @RowCount3 = @@ROWCOUNT 
    UPDATE Table4 Set Column = 0 WHERE Column IS NULL 
    SELECT @RowCount4 = @@ROWCOUNT 

    SELECT @RowCount1 AS Table1, @RowCount2 AS Table2, @RowCount3 AS Table3, @RowCount4 AS Table4 
END 
8

आप आंकड़े एकत्रित करने के रूप में तुम जाओ की जरूरत हो सकती है, लेकिन @@ROWCOUNT कब्जा इस:

declare @Fish table (
Name varchar(32) 
) 

insert into @Fish values ('Cod') 
insert into @Fish values ('Salmon') 
insert into @Fish values ('Butterfish') 
update @Fish set Name = 'LurpackFish' where Name = 'Butterfish' 
select @@ROWCOUNT --gives 1 

update @Fish set Name = 'Dinner' 
select @@ROWCOUNT -- gives 3 
9

यह वास्तव में क्या OUTPUT खंड है एसक्यूएल सर्वर 2005 के बाद में उत्कृष्ट है।

उदाहरण

में
CREATE TABLE [dbo].[test_table](
    [LockId] [int] IDENTITY(1,1) NOT NULL, 
    [StartTime] [datetime] NULL, 
    [EndTime] [datetime] NULL, 
PRIMARY KEY CLUSTERED 
(
    [LockId] ASC 
) ON [PRIMARY] 
) ON [PRIMARY] 

INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 07','2009 JUL 07') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 08','2009 JUL 08') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 09','2009 JUL 09') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 10','2009 JUL 10') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 11','2009 JUL 11') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 12','2009 JUL 12') 
INSERT INTO test_table(StartTime, EndTime) 
VALUES('2009 JUL 13','2009 JUL 13') 

UPDATE test_table 
    SET StartTime = '2011 JUL 01' 
    OUTPUT INSERTED.* -- INSERTED reflect the value after the UPDATE, INSERT, or MERGE statement is completed 
WHERE 
    StartTime > '2009 JUL 09' 

परिणामों के बाद लौटाए जाने

LockId StartTime    EndTime 
------------------------------------------------------- 
4  2011-07-01 00:00:00.000 2009-07-10 00:00:00.000 
5  2011-07-01 00:00:00.000 2009-07-11 00:00:00.000 
6  2011-07-01 00:00:00.000 2009-07-12 00:00:00.000 
7  2011-07-01 00:00:00.000 2009-07-13 00:00:00.000 

अपने विशेष मामले में, जब से तुम OUTPUT साथ कुल कार्यों का उपयोग नहीं कर सकते हैं, तो आप एक तालिका में INSERTED.* के उत्पादन पर कब्जा करने की जरूरत है परिवर्तनीय या अस्थायी तालिका और रिकॉर्ड गिनती। उदाहरण के लिए,

DECLARE @temp TABLE (
    [LockId] [int], 
    [StartTime] [datetime] NULL, 
    [EndTime] [datetime] NULL 
) 

UPDATE test_table 
    SET StartTime = '2011 JUL 01' 
    OUTPUT INSERTED.* INTO @temp 
WHERE 
    StartTime > '2009 JUL 09' 


-- now get the count of affected records 
SELECT COUNT(*) FROM @temp 
+0

'आउटपुट COUNT (निहित। *) '' *' के पास गलत वाक्यविन्यास का कारण बनता है। –

+0

@SteveTaylor आप सही हैं। मैं अब अपडेट करूंगा –

1

सुनिश्चित करें कि कॉलम प्रकार उस मान का समर्थन करता है जिसे आप पास करने का प्रयास कर रहे हैं! एक ही समस्या थी क्योंकि मैं 13 (आईएनटी) फ़ील्ड चौड़ाई को 13 अंकों की मान संख्या अपडेट करने का प्रयास कर रहा था।

संबंधित मुद्दे

 संबंधित मुद्दे