سؤال

لدي البرنامج النصي SQL التالي:

DECLARE @temp table (
    ID int IDENTITY(1, 1),
    data nvarchar(100)
)

INSERT INTO @temp (data) VALUES ('a,b,c')
INSERT INTO @temp (data) VALUES ('d,e,f')

SELECT *
FROM @temp AS T
    INNER JOIN
        (SELECT *
        FROM dbo.__StringSplit(T.data, ',', T.ID)) AS S
    ON T.ID = S.RefID

وعلى بعد النقر! تنفيذ، حصلت على هذه:

Line 17 The multi-part identifier "T.data" could not be bound.

لقد حاولت أيضا إصدار عدم الانضمام وحصلت على نفس الخطأ:

SELECT T.ID, S.Item AS dataItem
FROM @temp AS T, dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID

...

ما كنت أتوقع أنه يجب أن أحصل على طاولة مع معرفات القادمة من @ Test.ID وكل قيم مفصولة بفواصل في @ Test.Data يحصل تقسيم إلى سجلاتها وقيمتها وضعت في حقل Dataitem.

كيف يمكنني تحقيق ذلك؟
هل أنا مطلوب لاستخدام المؤشرات؟

لقد قمت بلصق DBO. __ تنفيذ الوظائف المرفقة http://pastebin.com/f7dd6350f.

شكرا!

هل كانت مفيدة؟

المحلول

في SQL2000 تحتاج إلى مؤشرات. في SQL2005 / 2008، يمكنك استخدام الصليب تطبيق التبرعات؛ ربما مثل التالي (لا أستطيع اختبار الآن):

SELECT T.ID, S.Item AS dataItem
FROM @temp AS T CROSS APPLY dbo.__StringSplit(T.data, ',', T.ID) AS S

تعديل - وجدت هذه الصفحة على التقاطع ثم جاء مع:

SELECT T.ID, S.Item AS dataItem
FROM @temp AS T
    CROSS APPLY
    dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID

التي حل مشكلتي :-)

نصائح أخرى

وظيفة سلسلة الانقسام الخاصة بك بطيئة حقا، إليك رابط لجعل واحدة أسرع بكثير:

http://www.sommarskog.se/arrays-in-sql.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top