2013-05-14 5 views
21

Mam następujące kwerendy wewnątrz większej Select w SQL Server:SQL „rzeczy” i „FOR XML PATH” generowania dziwnych symboli

CONVERT(NVARCHAR(2000),stuff((SELECT '; ' + IsNull(D2.SelectedComments,'') 
FROM #StudentDetails D2 
WHERE D2.STUD_PK = A.STUD_PK AND D2.CourseNo = A.CourseNo 
AND D2.Section = A.Section 
FOR XML PATH('')),1,2,'')) AS SelectedComments, 

Kolumna ta generuje jakieś dziwne symbole po niektórych wpisach, takich jak This approach is satisfactory .&#x0D . Nie rozumiem, skąd pochodzi .&#x0D. Próbowałem zrobić to przed SELECT SelectedComments FROM #StudentDetails i nie widzę .&#x0D. Czy ktoś może powiedzieć, skąd może pochodzić?

+0

0D jest HEX dla powrotu karetki: http://www.columbia.edu/kermit/ascii. html – valverij

+0

Myślę, że to powrót linii i karetki. Po dodaniu FOR XML PATH() do instrukcji Select pewne znaki, które nie są zgodne z XML, są kodowane, dołączane są także przekazywanie linii i karetki. O ile mi wiadomo, SQL wypisze prawidłowy kod XML z poprawnym kodowaniem – Rodders

Odpowiedz

39

Jeśli zmodyfikować wykorzystanie Dla XML Path, będzie to zrobić unescaping dla Ciebie i nie trzeba uciekać się do korzystania z funkcji Replace:

, Stuff(
     (
     Select '; ' + IsNull(D2.SelectedComments, '') 
     From #StudentDetails As D2 
     Where D2.Stud_PK = A.Stud_PK 
      And D2.CourseNo = A.CourseNo 
      And D2.Section = A.Section 
     For Xml Path(''), type 
     ).value('.', 'nvarchar(max)') 
     , 1, 2, '') As SelectedComments 
+0

, więc domyślnie "Dla XML" zwraca typ danych XML ze znakami ze spacją. Ma sens, a nawet więcej, aby jasno określić typ danych, który chcesz. – Davos

2

& # x0D to powrót karetki. Można też oczyścić dane przed włożeniem go, należy go usunąć, lub, jeśli chcesz zachować formatowanie, dodać typ do końca swoją SELECT:

SELECT * FROM MyData FOR XML PATH(''), TYPE 
Powiązane problemy