यह एक ट्रेवॉकर को लागू करने का प्रयास करने का एक बहुत ही अजीब तरीका है, चयन में @id बढ़ाना और इसे सबक्वायरी पर लागू करने की अपेक्षा करना। यह काम नहीं करता है क्योंकि SQL सर्वर क्वेरी सेटअप चरण में एक स्थिर अधिकार के रूप में सबक्वेरी एक्सप्रेशन के लिए @id के मान को लॉक कर देता है।
इस उदाहरण को देखें, जहां लौटाया गया @ मान स्पष्ट रूप से इंगित करता है कि @id 1 पर बंद है। आपके प्रश्न के साथ, इसे 0 पर बंद कर दिया गया था, इसलिए प्रत्येक सबक्वायरी न्यूल वापस आ जाएगी, जाहिरा तौर पर क्योंकि @id =0 के लिए कोई मिलान नहीं है।पी>
create table table1 (
id int);
create table table2 (
id int, value varchar(10));
insert table1 values (1),(2),(3),(4);
insert table2 values
(1,1),
(2,2),
(3,3),
(4,4);
DECLARE @id INT, @value VARCHAR(10);
SELECT @id=1, @value='';
SELECT
@value = @value + (SELECT TOP 1 value FROM TABLE2 WHERE [email protected]) + '-',
@id = @id+1
FROM TABLE1;
select @value, @id
-- result
1-1-1-1 5
यदि आप केवल 2 से मान चाहते हैं, तो वेरिएबल @id के बजाय, आप सबक्वायरी को तालिका आईडी से नीचे के रूप में सहसंबंधित करते हैं:
create table table1 (id int);
create table table2 (id int, value varchar(10));
insert table1 values (1),(2),(3),(4);
insert table2 values
(1,1),
(3,9),
(4,4);
DECLARE @value VARCHAR(10);
SELECT @value='';
SELECT
@value = @value + isnull((SELECT TOP 1 value
FROM TABLE2
WHERE id=table1.id) + '-','')
FROM TABLE1;
select @value
-- Result
1-9-4