2009-01-18 16 views
31

dbo.Split() जैसे dbo.Split() से तालिका-मूल्यवान फ़ंक्शन को देखते हुए, मैं कई पंक्तियों को तर्क के रूप में कैसे पास करूं?एकाधिक पंक्तियों पर तालिका-मूल्यवान फ़ंक्शन निष्पादित करें?

यह काम करता है:

SELECT * 
FROM dbo.Split 
    (',', (SELECT myColumn FROM Stuff WHERE id = 22268)) 
WHERE ISNULL(s,'') <> '' 

यह रिटर्न:

pn   s 
----------- ----------- 
1   22351 
2   22354 
3   22356 
4   22357 
5   22360 

लेकिन यह नहीं करता है:

SELECT * 
FROM dbo.Split 
    (',', (SELECT myColumn FROM Stuff)) 
WHERE ISNULL(s,'') <> '' 

न ही ऐसा करता है:

SELECT * FROM dbo.Split_temp(',', myColumn), Stuff 

The docs कहते हैं:

जब एक उपयोगकर्ता परिभाषित समारोह है कि एक मेज की ओर से एक सबक्वेरी के FROM खंड में उत्पन्न होता है, समारोह तर्क बाहरी क्वेरी से किसी भी स्तंभ संदर्भ नहीं दे सकता। सेट

परिणाम की तरह मैं कुछ ऐसा दिखाई देगा के लिए देख रहा हूँ:

id   pn   s 
----------- ----------- ----------- 
22268  1   22351 
22268  2   22354 
22268  3   22356 
22268  4   22357 
22268  5   22360 
24104  1   22353 
24104  2   22355 
24104  3   22356 
24104  4   22358 
24104  5   22360 
24104  6   22362 
24104  7   22364 
. 
. 
. 

वहाँ सब पर किसी भी तरह से (अलग ज़ाहिर है, एक कर्सर, से) यह पूरा करने के है?

(संपादित करें)

MarlonRibunal द्वारा अनुरोध के रूप में, एक नमूना तालिका के ऊपर परिणाम उपज की तरह दिखता है:

id   myColumn 
----------- ------------------------------------------- 
22268  22351,22354,22356,22357,22360, 
24104  22353,22355,22356,22358,22360,22362,22364, 

id एक int है; myColumn एक varchar(max) है।

उत्तर

48

OUTER APPLY:

SELECT Stuff.id 
    ,Results.pn 
    ,Results.s 
FROM stackoverflow_454945 AS Stuff 
OUTER APPLY dbo.Split(',', Stuff.myColumn) AS Results 
WHERE ISNULL(Results.s,'') <> '' 
+0

बहुत बढ़िया! दूसरा "फ्रॉम स्टफ" वास्तव में एक वाक्यविन्यास त्रुटि के रूप में चिह्नित किया गया था, लेकिन इसे हटाने के बाद, कथन ने वही किया जो मैं चाहता था। धन्यवाद। –

+0

ठीक है, मैंने इसे अपनी प्रतिलिपि/पेस्ट से छोड़ा - मैंने यहां कोड का परीक्षण और सही किया है। –

+0

'isnull (results.s, '') <> '' 'का उपयोग क्यों करें जब' परिणाम.s शून्य नहीं है 'भी काम करता है और बहुत अधिक terse है? – tgandrews

0

आप COALESCE संयोजन व्यवहार

declare @split varchar(max) 
set @split = '' 

select @split = @split + Coalesce(myColumn + ',' , ' ') 
from Stuff 
WHERE id = 22268 

select * from dbo.Split(',', @Left(@split,len(@split) -1)) 

मैं नहीं जानता कि है कि किसी भी एक कर्सर का उपयोग से बेहतर होगा इस्तेमाल कर सकते हैं।

+0

AIUI, तो उस पंक्ति के संबंधित आईडी, केवल मूल्य बनाए रखने नहीं होगा। –

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