这是论坛里面找的关于联查的一段代码:
--测试数据
if OBJECT_ID('tb') is not null 
drop table tb 
go
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'
GO
--2000的方法--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
declare @Level int
set @level=1
insert @t_level select @id,@level
while @@rowcount>0
begin 
    set @level=@level+1
    insert @t_Level select tb.id,@level
     from tb join @t_level t on tb.pid=t.id
     where t.level+1=@level
   end
   return
endselect tb.*
from tb join dbo.f_cid('002') b
on tb.ID=b.id
但是我运行时,提示如下,麻烦知道的大侠帮忙改下~~~~~(所影响的行数为 7 行)服务器: 消息 137,级别 15,状态 1,过程 f_Cid,行 10
必须声明变量 '@level'。
服务器: 消息 137,级别 15,状态 1,过程 f_Cid,行 10
必须声明变量 '@t_level'。
服务器: 消息 137,级别 15,状态 1,过程 f_Cid,行 10
必须声明变量 '@id'。
服务器: 消息 137,级别 15,状态 1,过程 f_Cid,行 13
必须声明变量 '@level'。
服务器: 消息 137,级别 15,状态 1,过程 f_Cid,行 15
必须声明变量 '@level'。
服务器: 消息 156,级别 15,状态 1,过程 f_Cid,行 21
在关键字 'select' 附近有语法错误。

解决方案 »

  1.   

    go
    select tb.* 
    from tb join dbo.f_cid('002') b 
    on tb.ID=b.id 加个GO,测试正常.
      

  2.   

    ....
    你把代码ctrl+A全选了 在F5 就正常了
      

  3.   

    --测试数据 
    if OBJECT_ID('tb') is not null 
    drop table tb 
    go 
    CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10)) 
    INSERT tb SELECT '001',NULL ,'山东省' 
    UNION ALL SELECT '002','001','烟台市' 
    UNION ALL SELECT '004','002','招远市' 
    UNION ALL SELECT '003','001','青岛市' 
    UNION ALL SELECT '005',NULL ,'四会市' 
    UNION ALL SELECT '006','005','清远市' 
    UNION ALL SELECT '007','006','小分市' 
    GO 
    --2000的方法 --查询指定节点及其所有子节点的函数 
    CREATE FUNCTION f_Cid(@ID char(3)) 
    RETURNS @t_Level TABLE(ID char(3),Level int) 
    AS 
    BEGIN 
    declare @Level int 
    set @level=1 
    insert @t_level select @id,@level 
    while @@rowcount>0 
    begin 
        set @level=@level+1 
        insert @t_Level select tb.id,@level 
        from tb join @t_level t on tb.pid=t.id 
        where t.level+1=@level 
      end 
      return 
    end 
    go--加go
    select tb.* 
    from tb join dbo.f_cid('002') b 
    on tb.ID=b.id 然后ctrl+A 再F5 就正常了
      

  4.   

    --测试数据 
    if OBJECT_ID('tb') is not null 
    drop table tb 
    go 
    CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10)) 
    INSERT tb SELECT '001',NULL ,'山东省' 
    UNION ALL SELECT '002','001','烟台市' 
    UNION ALL SELECT '004','002','招远市' 
    UNION ALL SELECT '003','001','青岛市' 
    UNION ALL SELECT '005',NULL ,'四会市' 
    UNION ALL SELECT '006','005','清远市' 
    UNION ALL SELECT '007','006','小分市' 
    GO 
    --2000的方法 --查询指定节点及其所有子节点的函数 
    CREATE FUNCTION f_Cid3(@ID char(3)) 
    RETURNS @t_Level TABLE(ID char(3),Level int) 
    AS 
    BEGIN 
    declare @Level int 
    set @level=1 
    insert @t_level select @id,@level 
    while @@rowcount>0 
    begin 
        set @level=@level+1 
        insert @t_Level select tb.id,@level 
        from tb join @t_level t on tb.pid=t.id 
        where t.level+1=@level 
      end 
      return 
    end 
    go--加go 
    select tb.* 
    from tb join dbo.f_cid3('002') b 
    on tb.ID=b.id 
    我加了,还是不行啊?(所影响的行数为 7 行)服务器: 消息 137,级别 15,状态 1,过程 f_Cid3,行 10
    必须声明变量 '@level'。
    服务器: 消息 137,级别 15,状态 1,过程 f_Cid3,行 10
    必须声明变量 '@t_level'。
    服务器: 消息 137,级别 15,状态 1,过程 f_Cid3,行 10
    必须声明变量 '@id'。
    服务器: 消息 137,级别 15,状态 1,过程 f_Cid3,行 13
    必须声明变量 '@level'。
    服务器: 消息 137,级别 15,状态 1,过程 f_Cid3,行 15
    必须声明变量 '@level'。
    服务器: 消息 170,级别 15,状态 1,过程 f_Cid3,行 20
    第 20 行: 'go' 附近有语法错误。
    我QQ30384318,谁能帮我看下啊?
      

  5.   

    --测试数据
    if OBJECT_ID('tb') is not null 
    drop table tb 
    go
    CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
    INSERT tb SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'
    GO
    --2000的方法--查询指定节点及其所有子节点的函数
    create   FUNCTION f_Cid(@ID char(3))
    RETURNS @t_Level TABLE(ID char(3),Level int)
    AS
    BEGIN
    declare @Level int
    set @level=1
    insert @t_level select @id,@level
    while @@rowcount>0
    begin 
        set @level=@level+1
        insert @t_Level select tb.id,@level
         from tb join @t_level t on tb.pid=t.id
         where t.level+1=@level
       end
       return
    end
    go
    select tb.*
    from tb join dbo.f_cid('002') b
    on tb.ID=b.id
    /*
    ID   PID  Name
    ---- ---- ----------
    002  001  烟台市
    004  002  招远市*/
    复制黏贴过去试试