2011-12-19 21 views
1
;WITH Companies(pkCompanyID,name,parentCompanyID,SomeId) AS 

     (
      SELECT 
       tblCompany.pkCompanyID, 
       tblCompany.name, 
       NULL,--this is a int with no value and it works in the anchor 
       NULL AS SomeId--But this uniqueidentifier do not work why? 
      FROM 
       tblCompany 
      WHERE 
       tblCompany.fkCompToCompID IS NULL 
      UNION ALL 
      SELECT 
       tblCompany.pkCompanyID, 
       tblCompany.name, 
       tblCompany.fkCompToCompID, 
       NEWID() 
      FROM 
       tblCompany 
       JOIN Companies ON tblCompany.fkCompToCompID=Companies.pkCompanyID 
     ) 
     SELECT 
      * 
     FROM 
      Companies 

所以这个功能会给出错误值:公司“‘‘递归查询’SomeId”类型不锚和列递归部分之间的匹配’。我知道我可以用“CAST(NULL AS uniqueidentifier)”替换“NULL AS SomeId”来修复它。但是,为什么当parentCompanyId不需要知道它是一个int时,锚点需要知道它是唯一标识符?是否因为uniqueidentifier是一个对象而int是一个值类型?递归CTE具有唯一标识符必须在锚

回答

3

NULL默认假定为int这就是为什么您不必明确投射那一个。

您可以从

SELECT NULL AS FOO INTO BAR; 

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME='FOO'AND TABLE_NAME='BAR'; 
+0

感谢你的答案看到这一点。帮助我理解 – Arion 2011-12-19 14:51:08