2009-04-15 3 views
1

Ich versuche, in meiner SQL-Programmierung effizienter zu werden. Ich versuche eine Schleife auszuführen, um einen Aktualisierungsbefehl für Feldnamen zu wiederholen, die sich nur durch ein numerisches Suffix ändern.Verwenden von While-Schleife für SQL Server-Update

Zum Beispiel, statt des Schreibens aus x_1, y_1, dann x_2, y_2 für jedes Update:

DECLARE @a INT 
DECLARE @b VARCHAR 

SET @a = 1 
WHILE @a < 30 
set @b = @a 
    BEGIN 
     UPDATE source set h = h + "x_"[email protected] 
      where "y_"[email protected] = 'Sold' 
    SET @a = @a + 1 
    END 

Lassen Sie mich wissen, ob ich klären kann. Ich verwende SQL Server 2005.

Danke für jede Anleitung.


Ich versuche Adams-Lösung anzuwenden und müssen verstehen, was richtige Verwendung von N‘in der folgenden:

exec sp_executesql update source_temp set pmt_90_day = pmt_90_day + convert(money,'trans_total_'[email protected]'') 
    where convert(datetime,'effective_date_'[email protected]) <= dateadd(day,90,ORSA_CHARGE_OFF_DATE) 
    and DRC_FLAG_'[email protected] = 'C' 

Antwort

6

Dies wird nicht wirklich funktionieren, wie Sie nicht haben können der Spaltenname in Anführungszeichen Was Sie im Wesentlichen tun, ist, dass SQL zwei Zeichenfolgen vergleicht, die immer unterschiedlich sind, was bedeutet, dass Sie niemals ein Update durchführen werden.

Wenn Sie es auf diese Weise tun müssen, würden Sie so etwas wie haben müssen ...

DECLARE @a INT 
DECLARE @b VARCHAR 
SET @a = 1 

WHILE @a < 30 
BEGIN 
set @b = @a 
exec sp_executesql N'UPDATE source set h = h + 'x_'[email protected] + N' 
      where y_'[email protected] + N' = ''Sold''' 

SET @a = @a + 1 
END 

Im Allgemeinen jedoch, würde ich diese Praxis entmutigen. Ich bin kein Fan von dynamischem SQL, das in einer anderen SQL-Anweisung für jede Art von Produktionscode generiert wird. Sehr nützlich für einmalige Entwicklungsaufgaben, aber ich mag es nicht für Code, der von einem Benutzer ausgeführt werden könnte.

+0

Adam, wenn Sie in Bezug auf meine Revision helfen könnten, würde ich es begrüßen. – homerjay

+1

@homer: N 'erstellt ein Nvarchar, anstatt ein Varchar. Es ist eine String-Quoting-Kennung. Beispiel, N'Dies ist mein String 'ist ein Nvarchar, und' Dies ist mein String 'ist ein Varchar. Ich habe N 'verwendet, weil sp_executesql einen nvarchar akzeptiert. –

1

Adam hat viel mit dem Problem selbst zu tun, aber ich werde das zugrunde liegende Problem erwähnen, von dem dies nur ein Symptom ist. Ihr Datenmodell ist mit ziemlicher Sicherheit schlecht. Wenn Sie planen, viel (jede) SQL-Entwicklung zu machen, sollten Sie einführende Bücher über Datenmodellierung lesen. Eine der ersten Regeln der Normalisierung ist, dass Entitäten keine sich wiederholenden Gruppen enthalten sollten. Zum Beispiel sollten Sie nicht Spalten „phone_1“ genannt haben, „phone_2“ usw.

Hier ist eine viel bessere Möglichkeit, diese Art von Situation zu modellieren:

CREATE TABLE Contacts (
    contact_id INT NOT NULL, 
    contact_name VARCHAR(20) NOT NULL, 
    contact_description VARCHAR(500) NULL, 
    CONSTRAINT PK_Contacts PRIMARY KEY CLUSTERED (contact_id) 
) 

CREATE TABLE Contact_Phones (
    contact_id INT NOT NULL, 
    phone_type VARCHAR(10) NOT NULL, 
    phone_number VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Contact_Phones PRIMARY KEY CLUSTERED (contact_id, phone_type), 
    CONSTRAINT CK_Contact_Phones_phone_type CHECK (phone_type IN ('HOME', 'FAX', 'MOBILE')) 
) 

Nun, statt zu versuchen, Verketten Sie eine Zeichenkette, um mit verschiedenen Spalten umzugehen, die Sie als Set behandeln können, und rufen Sie die gewünschten Telefonnummern über die Geschäftslogik ab. (Tut mir leid, dass ich dein Beispiel nicht benutzt habe, aber es schien ein bisschen zu allgemein und schwer zu verstehen).