2016-07-08 5 views
0

は早期私のコードでは、私は(他の変数間の)変数を宣言した:ジョインを含む選択式を使用して宣言された変数を設定しますか?

DECLARE @ZIPFk int; 

続いて、その後すぐに、私は2つが含まれて参加する選択式を使用して上記の変数の値を設定しよう

SET @ZIPFk=(SELECT Zip.id 
FROM Zip 
INNER JOIN Zip5 ON Zip5.id=Zip.Zip5Fk 
JOIN PlaceName ON Zip5.PlaceNameFk=PlaceName.id 
WHERE [email protected] AND [email protected]) 

これは機能しません。理由を把握することができません。結果のテーブルは、@ ZIPFkの値を入力したい/期待したいフィールドにNULL値を持っています。宣言された変数を除いて、単独で実行すると、SELECTION式は単一の行/単一の列/単一の値を持つ表になります。

USE MyDatabase; 
DECLARE @USPSComm varchar = 'Springville' --<--Enter USPS ZIP community name here 
DECLARE @ZIPCode varchar = '99221' --<--Enter USPS ZIP Code here 
DECLARE @RowsToProcess int; 
DECLARE @ZIPFk int; 
DECLARE @CurrentRow int; 
DECLARE @SelectedUUID uniqueidentifier; 
DECLARE @UUIDTable table (RowID int not null primary key identity (1,1), UUID uniqueidentifier); 

SET @ZIPFk=(SELECT a.id 
    FROM dbo.Zip AS a 
    INNER JOIN Zip5 as b ON b.id=a.Zip5Fk 
    JOIN PlaceName as c ON b.PlaceNameFk=c.id 
    WHERE [email protected] AND [email protected])    

INSERT INTO @UUIDTable (UUID) VALUES 
    ('f4x6faf4-bxx2-4166-bcd6-88c9af8ab546'), ('3e20xx5e-5edc-4735-8962-5ab3c50d053e'), 
    ('696xxB2D-50DE-4361-807D-48xxD2AC5CxB') 
    , ('c5879x41-e144-4ecc-8056-5493exxx1a5'), ('af7993cf-2xec-4c5f-b02e-92cb6dxxxf2b') 

SET @RowsToProcess [email protected]@ROWCOUNT 

SET @CurrentRow=0 
WHILE @CurrentRow<@RowsToProcess 
BEGIN 
    SET @CurrentRow [email protected]+1 
    SELECT 
     @SelectedUUID=UUID 
     FROM @UUIDTable 
     WHERE [email protected] 

UPDATE CompleteSubaddressZip 
    SET [email protected] 
    FROM CompleteSubaddressZip as a 
    JOIN CompleteSubaddress AS b ON b.id=a.CompleteSubaddressFk 
    WHERE ([email protected]) 
END 
:全体の事を見

UPDATE CompleteSubaddressZip 
SET [email protected] 
FROM CompleteSubaddressZip as a 
JOIN CompleteSubaddress AS b ON b.id=a.CompleteSubaddressFk 
WHERE ([email protected]) 

そして...ここにされています。ここでは

は、実際のUPDATEが宣言された変数を使用して、発生したクエリの最後を見ています
+1

*作業していないとはどういう意味ですか? –

+0

これは、@ ZIPFk値を持つテーブルの1つのフィールドを更新することになっていますが、代わりにNULLに更新します。私はオリジナルの投稿(上記)を私のクエリのその部分でも更新します... –

+0

なぜループを使用していますか?一度にすべてのレコードを設定することができます。さらに、zipからzip5への結合をplacemnameに行うことで、サブアドレスを完了してUUIDTableにサブアドレスを完成させ、1つのステートメントですべて実行することができます。 – Matt

答えて

0

私はこのスレッドを読んでいる人には謝ります。私の悩みや、私の問題を解決するために何を変えたのか分からないという事実は、このスレッドをほとんど役に立ちません。

しかし、後世のために、実際に意図した通りに動作する最終的な(?)クエリがここにあります。 (私は物事をきれいにするのを手伝ってくれたユーザ "Matt"のコメントに多くのおかげで、少なくとも私を正しい道につけてくれた。私は「ルーピング」を取り出して不要な変数を削除し、一般的にすべてを単純化しました。

USE MyDatabase; 
DECLARE @USPSComm varchar (20)='Springfield'; -- <--Enter USPS ZIP community name here 
DECLARE @ZIPCode varchar (5)='97477'; -- <--Enter USPS ZIP Code here 
DECLARE @ZIPFk int; 

SET @ZIPFk=(SELECT x.id 
FROM Zip AS x 
INNER JOIN Zip5 as y ON y.id=x.Zip5Fk 
JOIN PlaceName as z ON y.PlaceNameFk=z.id 
WHERE [email protected] AND [email protected]); 

UPDATE a 
SET [email protected] 
FROM CompleteSubaddressZip as a 
JOIN CompleteSubaddress AS b ON b.id=a.CompleteSubaddressFk 
JOIN Zip as c ON a.ZipFk=c.id 
JOIN Zip5 as d ON c.Zip5Fk=d.id 
JOIN PlaceName as e ON d.PlaceNameFk=e.id 
WHERE b.AddressUUID IN ('xxxxxxxx-xxxx-UUID-xxxx-xxxxxxxxxxxx' 
, 'xxxxxxxx-xxxx-UUID-xxxx-xxxxxxxxxxxx' 
, 'xxxxxxxx-xxxx-UUID-xxxx-xxxxxxxxxxxx' 
, 'xxxxxxxx-xxxx-UUID-xxxx-xxxxxxxxxxxx' 
, 'xxxxxxxx-xxxx-UUID-xxxx-xxxxxxxxxxxx'); 
0
DECLARE @ZIPCode varchar = '99221' --<--Enter USPS ZIP Code here 
DECLARE @RowsToProcess int; 
DECLARE @ZIPFk int; 
DECLARE @CurrentRow int; 
DECLARE @SelectedUUID uniqueidentifier; 
DECLARE @UUIDTable table (RowID int not null primary key identity (1,1), UUID uniqueidentifier); 

SELECT TOP 1 @ZIPFk = Zip.id 
FROM Zip 
INNER JOIN Zip5 ON Zip5.id=Zip.Zip5Fk 
JOIN PlaceName ON Zip5.PlaceNameFk=PlaceName.id 
WHERE [email protected] AND [email protected] 

INSERT INTO @UUIDTable (UUID) VALUES 
    ('f4x6faf4-bxx2-4166-bcd6-88c9af8ab546'), ('3e20xx5e-5edc-4735-8962-5ab3c50d053e'), 
    ('696xxB2D-50DE-4361-807D-48xxD2AC5CxB') 
    , ('c5879x41-e144-4ecc-8056-5493exxx1a5'), ('af7993cf-2xec-4c5f-b02e-92cb6dxxxf2b') 

UPDATE CompleteSubaddressZip 
    SET [email protected] 
    FROM 
     CompleteSubaddressZip as a 
     INNER JOIN CompleteSubaddress AS b 
     ON b.id=a.CompleteSubaddressFk 
     INNER JOIN @UUIDTable u 
     ON b.AddressUUID=u.UUID 
+0

複数の値があるとは思いません。 .. SELECTIONクエリは、(それが宣言された変数なしで動作するように少し変更して)単独で実行すると、1つの値を選択するだけです。 –

+0

私は、より明示的にSET @ ZIPFk = 121という変数を設定してクエリ全体を実行しようとしましたが、期待どおりに機能しました。 –

+0

これは、変数に値を設定するクエリで結果が返されず、クエリを修正する必要があることを意味します。数千(+何百万も...)のレコードをバッチ更新するために使用しない限り、ループを失うことを強くお勧めします。 – Matt