SORU
16 Ocak 2009, Cuma


Group_concat MySQL SQL Server işlevi taklit?

Microsoft SQL Server 2005 (hayat bu zor bir seçim, ama değil) üzerinde MySQL tabanlı bir uygulama göç etmeye çalışıyorum.

Orijinal uygulamasında kullanılırneredeyseANSI-SQL, önemli bir istisna ile uyumlu tablolar -- kullandık tamamen MySQL group_concat oldukça sık fonksiyonu.

group_concat Bu arada, bunu yapar: bir tablo, verilen, çalışanların isimleri ve projeleri söylüyorlar

SELECT empName, projID FROM project_members;

verir:

ANDY   |  A100
ANDY   |  B391
ANDY   |  X010
TOM    |  A100
TOM    |  A510

... ve burada group_concat ile ne olsun

SELECT 
    empName, group_concat(projID SEPARATOR ' / ') 
FROM 
    project_members 
GROUP BY 
    empName;

verir:

ANDY   |  A100 / B391 / X010
TOM    |  A100 / A510

...Yani bilmek istediğim şey: yazmak mümkün, ki group_concat işlevselliğini çalışan SQL Server kullanıcı tanımlı bir işlev mi? Hemen hemen hiçbir deneyimi böyle UDF, saklı yordamları veya bir şey kullanarak sadece düz ... o yüzden lütfen çok fazla açıklama tarafta SQL hata :)

CEVAP
16 Ocak 2009, Cuma


Çok kolay bir yolu yok bunu yapmak için. Birçok fikir vardır gerçi.

Best one I've found:

SELECT table_name, LEFT(column_names , LEN(column_names )-1) AS column_names
FROM information_schema.columns AS extern
CROSS APPLY
(
    SELECT column_name   ','
    FROM information_schema.columns AS intern
    WHERE extern.table_name = intern.table_name
    FOR XML PATH('')
) pre_trimmed (column_names)
GROUP BY table_name, column_names;

Ya da verileri < gibi karakterler içerebilir eğer düzgün çalışan bir versiyonu

WITH extern
     AS (SELECT DISTINCT table_name
         FROM   INFORMATION_SCHEMA.COLUMNS)
SELECT table_name,
       LEFT(y.column_names, LEN(y.column_names) - 1) AS column_names
FROM   extern
       CROSS APPLY (SELECT column_name   ','
                    FROM   INFORMATION_SCHEMA.COLUMNS AS intern
                    WHERE  extern.table_name = intern.table_name
                    FOR XML PATH(''), TYPE) x (column_names)
       CROSS APPLY (SELECT x.column_names.value('.', 'NVARCHAR(MAX)')) y(column_names) 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CareyHolzman

    CareyHolzman

    24 Ocak 2008
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • Max Lee

    Max Lee

    18 AĞUSTOS 2006