2008-09-18 6 views
8

मैं एक Access 2007 एसक्यूएल सर्वर के COALESCE समारोह के बराबर की तलाश में हूँ।कम्बाइन पंक्तियों/CONCATENATE पंक्तियों

एसक्यूएल सर्वर में आप की तरह कुछ कर सकता है:

व्यक्ति

John 
Steve 
Richard 

एसक्यूएल

DECLARE @PersonList nvarchar(1024) 
SELECT @PersonList = COALESCE(@PersonList + ',','') + Person 
FROM PersonTable 

PRINT @PersonList 

कौन सा पैदा करता है: जॉन, स्टीव, रिचर्ड

मैं वही करना चाहता हूं लेकिन एक्सेस 2007 में।

क्या किसी को पता है कि 2007 में इस तरह की पंक्तियों को कैसे जोड़ना है?

उत्तर

13

यहां नमूना उपयोगकर्ता परिभाषित फ़ंक्शन (यूडीएफ) और संभावित उपयोग है।

फंक्शन:

Function Coalsce(strSQL As String, strDelim, ParamArray NameList() As Variant) 
Dim db As Database 
Dim rs As DAO.Recordset 
Dim strList As String 

    Set db = CurrentDb 

    If strSQL <> "" Then 
     Set rs = db.OpenRecordset(strSQL) 

     Do While Not rs.EOF 
      strList = strList & strDelim & rs.Fields(0) 
      rs.MoveNext 
     Loop 

     strList = Mid(strList, Len(strDelim)) 
    Else 

     strList = Join(NameList, strDelim) 
    End If 

    Coalsce = strList 

End Function 

उपयोग:

SELECT documents.MembersOnly, 
    Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who, 
    Coalsce("",":","Mary","Joe","Pat?") AS Others 
FROM documents; 

एक एडीओ संस्करण, एक टिप्पणी से प्रेरित द्वारा onedaywhen

Function ConcatADO(strSQL As String, strColDelim, strRowDelim, ParamArray NameList() As Variant) 
    Dim rs As New ADODB.Recordset 
    Dim strList As String 

    On Error GoTo Proc_Err 

     If strSQL <> "" Then 
      rs.Open strSQL, CurrentProject.Connection 
      strList = rs.GetString(, , strColDelim, strRowDelim) 
      strList = Mid(strList, 1, Len(strList) - Len(strRowDelim)) 
     Else 
      strList = Join(NameList, strColDelim) 
     End If 

     ConcatADO = strList 

    Exit Function 

    Proc_Err: 
     ConcatADO = "***" & UCase(Err.Description) 
    End Function 

से: http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29

+0

मैं भी लंबे समय के लिए इस समस्या का समाधान तलाश रहे हैं - धन्यवाद! - छोटे सुधार अग्रणी सीमांकक सही ढंग से सूची से छीन नहीं है: strList = मध्य (strList, लेन (strDelim) +1) – JeffP

0

मुझे लगता है कि एनजी वह है जो आप कर रहे हैं, वाक्यविन्यास Nz(variant, [if null value]) है। यहाँ दस्तावेज़ीकरण लिंक है: Nz Function

---Person--- 
John 
Steve 
Richard 

DECLARE @PersonList nvarchar(1024) 
SELECT @PersonList = Nz(@PersonList + ',','') + Person 
FROM PersonTable 

PRINT @PersonList 
0

हालांकि Nz सम्मिलित करने के लिए एक तुलनीय बात करता है, तो आप इसे Access में आपरेशन आप प्रदर्शन कर रहे हैं करने के लिए उपयोग नहीं कर सकते। यह COALESCE नहीं है जो पंक्ति मानों की सूची बना रहा है, यह एक चर में concatenatiion है।

दुर्भाग्य से, यह एक एक्सेस क्वेरी के अंदर संभव नहीं है जिसे एक एकल SQL कथन होना चाहिए और जहां एक चर घोषित करने की कोई सुविधा नहीं है।

मुझे लगता है कि आपको एक ऐसा फ़ंक्शन बनाना होगा जो एक परिणाम खोल देगा, उस पर पुनरावृत्त करेगा और पंक्ति मानों को स्ट्रिंग में जोड़ देगा।

0

Access में पंक्तियों संयोजित करने के लिए, तो आप शायद कोड है कि इस तरह दिखता है की आवश्यकता होगी:

Public Function Coalesce(pstrTableName As String, pstrFieldName As String) 

Dim rst As DAO.Recordset 
Dim str As String 

    Set rst = CurrentDb.OpenRecordset(pstrTableName) 
    Do While rst.EOF = False 
     If Len(str) = 0 Then 
      str = rst(pstrFieldName) 
     Else 
      str = str & "," & rst(pstrFieldName) 
     End If 
     rst.MoveNext 
    Loop 

    Coalesce = str 

End Function 

आपको त्रुटि हैंडलिंग कोड जोड़ सकते हैं और अपने recordset को साफ करना चाहते हैं, और यह थोड़ा बदल जाएगा यदि आप डीएओ के बजाय एडीओ का उपयोग करते हैं, लेकिन सामान्य विचार वही है।

0

मैं यहाँ समझते हैं कि आप 3 रिकॉर्ड के साथ एक मेज "व्यक्ति" की है। एक्सेस में आपके द्वारा वर्णित कुछ भी तुलनीय नहीं है।

"मानक" एक्सेस (डीएओ recordset) में, आप एक recordset खोलने के लिए और अपने डेटा

Dim rs as DAO.recordset, _ 
    personList as String, _ 
    personArray() as variant 

set rs = currentDb.open("Person") 
set personArray = rs.getRows(rs.recordcount) 

rs.close 

एक बार आप इस सरणी है (यह bidimensional हो जाएगा) के लिए getrows विधि का उपयोग करना होगा आप आपको "कॉलम" निकालने के लिए इसे कुशलतापूर्वक उपयोग कर सकते हैं। इससे एक-आयाम सरणी निकालने का एक शानदार तरीका हो सकता है, ताकि आप एक स्ट्रिंग में प्रत्येक सरणी मान को संयोजित करने के लिए "जुड़ें" निर्देश का उपयोग कर सकें।

+0

व्यक्ति फ़ील्ड नाम है टी में वह जबकि उदाहरण तालिका PersonTable है। –

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

  • कोई संबंधित समस्या नहीं^_^