2011-02-17 148 views
2

我試圖得到一些SQL執行4列的排序規則衝突,但我發現了以下錯誤無法解析的SELECT語句

Msg 451, Level 16, State 1, Line 1 
Cannot resolve collation conflict for column 4 in SELECT statement. 

,但似乎無法找出問題出在哪裏???任何幫助將非常感激。

SELECT  MEMBTYPEID.text AS MemberType, MEMBLST.nodeId, MEMBTYPES.Name AS MemberField, 
         ISNULL(CASE WHEN MEMBTYPES.datatypeID IN 
          (SELECT  NodeId 
          FROM   DBO.CMSDATATYPE 
          WHERE  DBTYPE = 'Nvarchar') THEN MEMBDATA.[dataNvarchar] WHEN MEMBTYPES.datatypeID IN 
          (SELECT  NodeId 
          FROM   DBO.CMSDATATYPE 
          WHERE  DBTYPE = 'Ntext') THEN MEMBDATA.[dataNtext] WHEN MEMBTYPES.datatypeID IN 
          (SELECT  NodeId 
          FROM   DBO.CMSDATATYPE 
          WHERE  DBTYPE = 'Date') THEN CONVERT(NVARCHAR, MEMBDATA.[dataDate]) WHEN MEMBTYPES.datatypeID IN 
          (SELECT  NodeId 
          FROM   DBO.CMSDATATYPE 
          WHERE  DBTYPE = 'Integer') THEN CASE WHEN 
          (SELECT  value 
          FROM   [dbo].[cmsDataTypePreValues] 
          WHERE  datatypenodeid = MEMBTYPES.[dataTypeId] AND id = CONVERT(INT, MEMBDATA.[dataInt])) IS NOT NULL THEN 
          (SELECT  value 
          FROM   [dbo].[cmsDataTypePreValues] 
          WHERE  datatypenodeid = MEMBTYPES.[dataTypeId] AND id = CONVERT(INT, MEMBDATA.[dataInt])) ELSE CONVERT(NVARCHAR, 
         MEMBDATA.[dataInt]) END ELSE NULL END, '') AS MemberData 
FROM   (SELECT  id, text 
         FROM   dbo.umbracoNode 
         WHERE  (nodeObjectType = '9b5416fb-e72f-45a9-a07b-5a9a2709ce43')) AS MEMBTYPEID LEFT OUTER JOIN 
          (SELECT  nodeId, contentType 
          FROM   dbo.cmsContent) AS MEMBLST ON MEMBLST.contentType = MEMBTYPEID.id LEFT OUTER JOIN 
         dbo.cmsPropertyType AS MEMBTYPES ON MEMBTYPES.contentTypeId = MEMBLST.contentType LEFT OUTER JOIN 
         dbo.cmsPropertyData AS MEMBDATA ON MEMBDATA.contentNodeId = MEMBLST.nodeId AND 
         MEMBDATA.propertytypeid = MEMBTYPES.id LEFT OUTER JOIN 
         dbo.cmsMember AS MEMB ON MEMB.nodeId = MEMBLST.nodeId 
WHERE  (MEMBLST.nodeId IS NOT NULL) 

我SQL技能是非常基本的,所以希望有人能幫助

~~~~~~~~~~~~工作代碼~~~~~~~~~~~~~

設法得到它工作,這裏是代碼

SELECT MEMBTYPEID.text AS MemberType, MEMBLST.nodeId, MEMBTYPES.Name AS MemberField, MEMBTYPES.Alias AS MemberFieldAlias, MEMB.LoginName, 
ISNULL(CASE 
WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Nvarchar') THEN MEMBDATA.[dataNvarchar] 
WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Ntext') THEN MEMBDATA.[dataNtext] 
WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Date') THEN CONVERT(NVARCHAR, MEMBDATA.[dataDate]) 
WHEN MEMBTYPES.datatypeID IN (SELECT NodeId FROM DBO.CMSDATATYPE WHERE DBTYPE = 'Integer') THEN CONVERT(NVARCHAR, MEMBDATA.[dataInt]) 
ELSE NULL END, NULL) 
AS MemberData 
FROM 
(SELECT id, text FROM dbo.umbracoNode WHERE (nodeObjectType = '9b5416fb-e72f-45a9-a07b-5a9a2709ce43')) AS MEMBTYPEID 
LEFT OUTER JOIN (SELECT nodeId, contentType FROM dbo.cmsContent) AS MEMBLST ON MEMBLST.contentType = MEMBTYPEID.id 
LEFT OUTER JOIN dbo.cmsPropertyType AS MEMBTYPES ON MEMBTYPES.contentTypeId = MEMBLST.contentType 
LEFT OUTER JOIN dbo.cmsPropertyData AS MEMBDATA ON MEMBDATA.contentNodeId = MEMBLST.nodeId AND MEMBDATA.propertytypeid = MEMBTYPES.id 
LEFT OUTER JOIN dbo.cmsMember AS MEMB ON MEMB.nodeId = MEMBLST.nodeId 
WHERE (MEMBLST.nodeId IS NOT NULL) 
+0

感謝大家的幫助,我最終得到了它的工作,並編輯了上述內容以添加工作版本 – leen3o 2011-02-17 13:07:22

回答

8

排序規則基本上是一個代碼頁,告訴SQL如何解釋/比較/排序字符串。例如,它可以是大小寫(敏感)或(不)忽略重音符號(如法語中的^)。有更多的信息,see here

在sql server中,您在服務器/數據庫/列級別上設置排序規則,其中每個較低級別都可以覆蓋較高級別的默認級別。這使得您可以比較兩個不同排序規則中的字符串。這就是抓住的地方。有時候不可能比較2種不同的排序規則。例如,如果列1不區分大小寫排序,列2區分大小寫,並且您將列1中的'AAA'與列2中的'aaa'進行比較,它們是否相等?在這種情況下,sql會引發歸類錯誤。

column 4引用您的MemberData列,即巨大的ISNULL(Case ...聲明。 Sql整理衝突通常發生在字符串之間的比較中,因此這意味着您的IN或=操作符之一是罪魁禍首。爲了調試,我會逐漸刪除部分語句,直到錯誤不再發生。然後檢查剛刪除的部分中的列的排序規則。如果它們不同,那很可能是你的問題。

然後,您可以使用COLLATE強制將其中一列的字符串轉換爲另一列的歸類。不過要注意的是,根據你的排序規則,你可以得到奇怪的比較結果,即''可以等於'a'。我會嘗試確定列中的哪些字符串正在給出排序規則錯誤,以便您可以看到使用COLLATE會產生什麼效果。

作爲一般規則,我建議不要重寫數據庫的默認排序規則,以防止出現此類問題。

0

您的表格中是否有「整理」列?

如果屬實,則應在名稱後面加上「整理」。 作爲一個例子,如果cmsPropertyType.contentTypeId是一個collat​​e列。 相反的: ON MEMBTYPES.contentTypeId = MEMBLST.contentType

你應該寫: ON MEMBTYPES.contentTypeId整理 'contentTypeIdCollat​​eAlias'= MEMBLST.contentType

退房文檔:Doc on MSDN

還要讀SemVanmeen的帖子更好地瞭解你的問題

0

兩名嫌犯。

第一個是這樣的:

SELECT  value 
FROM   [dbo].[cmsDataTypePreValues] 
WHERE  datatypenodeid = MEMBTYPES.[dataTypeId] AND id = CONVERT(INT, MEMBDATA.[dataInt]) 

是什麼類型value?它應該是nvarchar,否則你應該相應地轉換它。

第二個是ISNULL中的默認''。也許你應該把它定義爲N''

另外,關於子選擇,爲什麼它必須重複兩次,在WHEN,然後在THEN?你可以用COALESCE((SELECT value...), CONVERT(NVARCHAR, MEMBDATA.[dataInt]))完全替代CASE

2

對於第四列,我懷疑'='的任何一方是不同的排序規則。您可以嘗試在'='的任一側放置'collat​​e database_default'。 如果您嘗試第四列使用的每個表名稱上的'SP_HELP',這將幫助您查看列級別的排序規則是否有任何差異。 問題不在於數據的類型,而在於列的整理類型。 正如SemVanmeenen上面所說的,對於影響第四列的查詢,嘗試刪除語句的某些部分並嘗試運行它,然後再次將它們放入。這可能會幫助您識別違規的代碼行。 祝你好運!請讓我們知道你如何繼續。 Regards, Jen Stirrup www.jenstirrup.com