T-SQL تقسيم السلسلة في علاقة كثيرة إلى واحدة؟
-
11-09-2019 - |
سؤال
لدي البرنامج النصي 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
التي حل مشكلتي :-)
نصائح أخرى
وظيفة سلسلة الانقسام الخاصة بك بطيئة حقا، إليك رابط لجعل واحدة أسرع بكثير:
لا تنتمي إلى StackOverflow