0

好的,还有一个在 forums.asp.net 上没有得到任何好的答案的问题,所以我想我会在这里尝试。

作为安装过程的一部分,我们的 InstallShield 代码有一个 dll 插件,可以通过 ODBC 读取和应用架构/数据升级脚本。我必须在我们的安装程序上做一些工作,所以我将项目转移到另一台机器上并开始工作,但发生了一件奇怪的事情 - 一个一直在没有抱怨的情况下运行的脚本突然开始抛出

“递归查询“TempCategoryValue”的“PathFromRoot”列中的锚点和递归部分之间的类型不匹配

以前没有的 CTE 错误。唯一改变的是我们的 InstallShield 插件的编译器版本。

剧本很旧;它已经毫无怨言地运行了几年。该脚本正在处理旧的树表表示,尝试在每个节点处添加和填充树继承的字符串表示。这个想法是你不需要大量的外部连接或递归 CTE 来告诉你在任何给定时间你在树中的位置,因为新的 PathFromRoot 列会告诉你。

但是将编译器从 VS 2003 更新到 VS 2010 突然改变了它对 CTE 表达式的看法。

我们的 C++ 应用程序浏览一个文本文件,并将 GO 语句之间的所有内容作为单独的命令运行,尽管在同一个连接上。

我盯着查询看了一会儿,不明白为什么它认为类型不匹配。 [PathFromRoot]被声明为在 TreeTable 中,并且 CTE对递归子句varchar(900) not null有明确的说明。CONVERT(varchar(900),...)

任何人都知道为什么它会突然认为它们不同?

-- Table as it existed to start, before the script ran
CREATE TABLE [dbo].[TreeTable](
[TreeValueID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](128) NOT NULL,
[ParentValueID] [int] NULL
) ON [PRIMARY]

-- Add the PathFromRoot column to get a string representation of the tree hierarchy
ALTER TABLE TreeTable ADD PathFromRoot varchar(900) NOT NULL DEFAULT '.'
GO

-- Seed the new string column for the root tree values
UPDATE TreeTable SET PathFromRoot = CONVERT(nvarchar(25), TreeValueID) + '.'
WHERE ParentValueID IS NULL
GO

-- recursively update the rest of the PathFromRoot values
WITH TempTreeValue (ParentID, PathFromRoot, TreeValueID ) AS (  
-- anchor member definition  
SELECT ParentValueID, PathFromRoot, TreeValueID  FROM TreeTable  WHERE ParentValueID IS NULL
UNION ALL
 -- recursive member definition  
SELECT tv.ParentValueID,  CONVERT(varchar(900), tv.PathFromRoot + CONVERT(varchar(25), tv.TreeValueID) + '.') as [PathFromRoot], tv.TreeValueID 
   FROM TreeTable tv  
   INNER JOIN TempTreeValue ttv ON tv.ParentValueID = ttv.TreeValueID 
)
UPDATE TreeTable  SET PathFromRoot = ttv.PathFromRoot FROM TreeTable t JOIN TempTreeValue ttv ON t.TreeValueID  = ttv.TreeValueID 

...
4

0 回答 0