בעיות Collation בפונקצייה Concat
גרסת SQL Server 2012 מביאה לא מעט חידושים משמחים, ואחד מהם הוא הפונקציה Concat שמשרשרת מספר מחרוזות למחרוזת אחת, בדומה לשימוש באופרטור + לשירשור, אך באופן ידידותי יותר: אין צורך להפוך מספרים ותאריכים לטקסטים בעזרת Cast וגם לא להמיר ערכי Null למחרוזות ריקות פן יהפכו את השירשור כולו ל-Null (מקווה שהבעיות שציינתי שנפתרו- מוכרות).
בהחלט שווה!
דא עקא שפתרו הרבה בעיות קיימות, אבל הכניסו בדלת האחורית בעייה חדשה שלא הייתה קיימת עד כה.
נניח שאנחנו רוצים לקבל מדטבייס ReportServer רשימת טבלאות עם שם הסכימה משורשרת אליהן כמקובל, ופונים לשם כך לטבלת המערכת INFORMATION_SCHEMA.TABLES (הדטבייס אמור להיות קיים אצל כל מי שהתקין התקנה סטנדרטית, וטבלת המערכת שציינתי היא אחת מכמה אופציות שיש). את כל זה אנחנו עושים מדטבייס אחר, נניח tempdb.
בשיטה הישנה היינו נוהגים כך:
Use tempdb;
Go
Select TABLE_SCHEMA+'.'+TABLE_NAME [Table]
From ReportServer.INFORMATION_SCHEMA.TABLES;
אין בעיות אך גם אין סומכים על הנס, ולכן נשתמש כעת ב-Concat:
Use tempdb;
Go
Select Concat(TABLE_SCHEMA,'.',TABLE_NAME) [Table]
From ReportServer.INFORMATION_SCHEMA.TABLES;
עכשיו כן יש בעיות: בגלל שלשני הדטבייסים Collations שונים- המערכת אינה יכולה לשרשר את שמות העמודות שנלקחו מ-ReportServer שלו Collation אחד עם תו נקודה ‘.’ שנלקח מדטבייס tempdb שלו Collation שונה..
קצת מצער לגלות שהפונקציה הזו סלחנית לערכי Null או למספרים המשורשרים לטקסטים, אבל בעיית collation שהוחלקה באלגנטיות בעבר – פתאום הופכת לאבן נגף.
הערה – אני מעריך שהרוב יתקלו בבעייה, בהנחה שה-Collations בשני הדטבייסים הנ”ל שונים.