其中这个动态语句哪里不对啊?
SET @sql=N'SELECT b.name FROM dbo.syscolumns a ,dbo.sysobjects b '+
N'WHERE a.id=b.id AND a.name= ' +char(39)+@ColumnName+char(39) +
N'AND b.name= ' +char(39)+@TableName+char(39)我print出来是这样的SELECT b.name FROM dbo.syscolumns a ,dbo.sysobjects b WHERE a.id=b.id AND a.name= 'ufts'AND b.name= 
后面的没有了,为什么?
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '=' 附近有语法错误。

解决方案 »

  1.   

    一个函数只能在一批中执行,你在其中加了 go ,这样函数的后部分就不包含在函数当中;
    还有 这个@sql 也没有使用CREATE FUNCTION dbo.F_Pub_IfHaveColumn(
    @TableName VARCHAR(50),
    @ColumnName VARCHAR(50)
    )
    RETURNS INT
    AS
    BEGIN
    DECLARE @s_Value VARCHAR(100),
            @i_Value INT,
            @sql NVARCHAR(500) SET @s_Value=null
    SET @sql=N'SELECT '+@s_Value+'=b.name FROM dbo.syscolumns a ,dbo.sysobjects b '+
     N'WHERE a.id=b.id AND a.name= ' +char(39)+@ColumnName+char(39) +
     N'AND b.name= ' +char(39)+@TableName+char(39)
    SET @i_Value=-1
    If @@Error<>0 
    begin
    If @s_Value is null
    SET @i_Value=-1
    else
    SET @i_Value=0
    end
    else
    RETURN -1
    RETURN @i_Value
    END
      

  2.   

    CREATE FUNCTION dbo.F_Pub_IfHaveColumn(
    @TableName VARCHAR(50),
    @ColumnName VARCHAR(50))
    RETURNS INT
    AS
    BEGIN
    DECLARE @s_Value VARCHAR(100),
            @i_Value INT,
            @sql NVARCHAR(500) SET @s_Value=null
    SET @sql=N'SELECT '+@s_Value+'=b.name FROM dbo.syscolumns a ,dbo.sysobjects b '+
     N'WHERE a.id=b.id AND a.name= ' +char(39)+@ColumnName+char(39) +
     N'AND b.name= ' +char(39)+@TableName+char(39)
    exec(@sql)--这里不是这样执行SQL吗? SET @i_Value=-1
    If @@Error<>0 
    begin
    If @s_Value is null
    SET @i_Value=-1
    else
    SET @i_Value=0
    end
    else
    RETURN -1 RETURN @i_Value


    END服务器: 消息 443,级别 16,状态 2,过程 F_Pub_IfHaveColumn,行 28
    在函数内不正确地使用了 'EXECUTE'。
      

  3.   

    函数里面无法使用 Execute(@SQL)这是最简单的,但是不能执行,错误跟你上面的一样:CREATE FUNCTION dbo.F_Pub_IfHaveColumn()
    RETURNS INT
    AS
    BEGIN
    exec('select 1')
    RETURN 1
    END
      

  4.   


    另外你的功能好像是判断某表是否函数某列吧,可以这么写。
    CREATE Function dbo.F_Pub_IfHaveColumn(
    @TableName VARCHAR(50),
    @ColumnName VARCHAR(50))
    Returns  Int --0为不存在,1为存在
    AS
    BEGIN
    Declare @Result Int
    If Exists(Select 1 from SysColumns Where Name=@ColumnName And ID=OBJECT_ID(@TableName))
    Set @Result=1
    Else
    Set @Result=0
    Return @Result
    END
    GO
      

  5.   

    谢谢,但是调用结果不对
    select dbo.F_Pub_IfHaveColumn('CheckVouch','ufts') 结果是0,应该是1才对。因为这个表有ufts字段的是不是动态SQL的问题啊?应该怎么改?
      

  6.   

    应该不可能出现你所说的情况,我测试OK,才贴出来的,检查下你的字段名和表名有没有写错。执行以下语句,看有没有结果Select 1 from SysColumns Where Name='ufts' And ID=OBJECT_ID('CheckVouch')也不会是动态语句的问题,因为没用到动态语句。
      

  7.   

    问题解决了
    你的SQL有问题,我改成这样就可以了
    elect 1 from dbo.SysColumns a,dbo.sysobjects b Where a.id=b.id and a.Name=@ColumnName And b.name=@TableName结贴
      

  8.   

    晕倒,我的SQL有问题,自己看吧--建立测试环境
    Create Table TEST(
    ID Int Identity,
    subject Nvarchar(10),
    keyword Nvarchar(100))
    --插入数据
    Insert Into TEST Values(N'信息主题1',N'电脑,电脑主机,联想电脑')
    Insert Into TEST Values(N'信息主题2',N'电脑主机,联想电脑')
    Insert Into TEST Values(N'信息主题3',N'显示器,三星显示器')
    GO
    --建立函数
    CREATE Function dbo.F_Pub_IfHaveColumn(
    @TableName VARCHAR(50),
    @ColumnName VARCHAR(50))
    Returns  Int --0为不存在,1为存在
    AS
    BEGIN
    Declare @Result Int
    If Exists(Select 1 from SysColumns Where Name=@ColumnName And ID=OBJECT_ID(@TableName))
    Set @Result=1
    Else
    Set @Result=0
    Return @Result
    END
    GO
    --测试
    Select dbo.F_Pub_IfHaveColumn('TEST','subject')
    GO
    --删除测试环境
    Drop Table TEST
    Drop Function dbo.F_Pub_IfHaveColumn
    GO
    --结果
    /*
    1
    */
      

  9.   

    你首先运行下Select 1 from SysColumns Where Name='ufts' And ID=OBJECT_ID('CheckVouch')看有没有结果。