select '+@column_name1+' from '+@table_name+' where '+@column_name2+' = @id
不知道是不是如此

解决方案 »

  1.   

    你的“@myReturn”到底要得到什么?
    字符串-->"(select 字段名 from 表名 where 字段id = @id )"   ??
    还是想得到select的结果集?
    如果是结果集,你这样写应该是不行的,可以定义@myReturn为recordset类型,接受结果集,或者借助临时表存放结果集就可以了。
      

  2.   

    当表名或者字段名为变量时,需要使用动态SQL,而函数不支持动态SQL
    建议使用存储过程来实现
      

  3.   

    我的函数没什么问题!
    关键是写死了!
    @myReturn是返回值!!
      

  4.   

    就要返回“select 字段名 from 表名 where 字段id = @id ”中的一个值,
    如:select ‘a' from ....
    你只要得到“a”这个值就可以了么?如果我理解的不对,麻烦LZ举个例子,写点测试数据,然后写出你想要的结果,谢谢。
      

  5.   


    不知道是否有误解你的意思,你的意思是否为表名是固定的,
    通过调用函数,输入一个字段ID,返回这个字段id对应的字段名称?
      

  6.   

    其实LZ应该是想拼接出一条查询语句吧!函数是不能执行动态SQL,但是并不是说不能拼接SQL语句
    LZ可以把传进去的变量拼接起来就行了。
    declare @tbname varchar(40),@fields varchar(1000),@id varchar(20),@result varchar(2000)
    set @fields='fielda,fieldb'
    set @tbname = 'tb'
    set @id = 'abc'
    set @result = 'select '+@fields +' from '+ @tbname +' where id='+@id
    print @result
      

  7.   

    试了一下,好像不行!!
    提示:无法绑定由多个部分组成的标识符
    我写的是:
    create FUNCTION [dbo].[Fn_General] (@tbName varchar(20),@field1 varchar(50),@field2 varchar(50),@id int)  
    RETURNS  varchar(100)
    AS
    BEGIN 
    declare @myReturn varchar(100)
    set @myReturn = 'select '+@field1 +' from '+ @tbName +' where ' +@field2 +'='+@id
    return @myReturn 
    END
    go
      

  8.   

    先不要写到函数里面去,你就像我那样的方式先打印(print)出来看看结果是怎么样的。
      

  9.   

    也不行!提示:转换成数据类型 int 时失败
      

  10.   

    我是这样写的:
    declare @tbName varchar(20),@field1 varchar(50),@field2 varchar(50),@id int,@myReturn varchar(50)
    set @tbName='build_type_name'
    set @field1='build_type'
    set @field2='build_type_id'
    set @id= 1
    set @myReturn='select '+@field1 +' from '+ @tbName +' where ' +@field2 +' = '+@id
    print @myReturn
      

  11.   

    用cast函数转换一下,把整型转成字符型。
    set @myReturn='select '+@field1 +' from '+ @tbName +' where ' +@field2 +' = '+cast(@id as varchar(20))
      

  12.   

    谢谢楼上 hao1hao2hao3
    用print语句对了,但写成函数就不行!!
    alter FUNCTION [dbo].[Fn_General] (@tbName varchar(20),@field1 varchar(50),@field2 varchar(50),@id varchar(11))  
    RETURNS  varchar(1000)
    AS
    BEGIN 
    declare @myReturn varchar(1000)
    set @myReturn = 'select '+@field1 +' from '+ @tbName +' where ' +@field2 +'='+@id
    exec @myReturn 
    return @myReturn 
    END
    go
    出错是
    找不到存储过程 'select build_type from build_type_name where build_type_id=1'。
      

  13.   

    #4楼的Josy都说过了。函数中不能执行动态SQL语句的
    你用这个语句exec @myReturn 
    当然会报错了。
      

  14.   


    declare @s varchar(1000)
    select @s= dbo.[Fn_General]('a','id,part,qty','id','1')
    exec(@s)这样就可以了。
      

  15.   

    或者用存储过程吧!create proc aproc
    @tbName varchar(20),@field1 varchar(50),@field2 varchar(50),@id varchar(11)
    as
    BEGIN 
    declare @myReturn varchar(1000)
    set @myReturn = 'select '+@field1 +' from '+ @tbName +' where ' +@field2 +'='+@id
    exec (@myReturn )
    END
    执行存储过程
    exec aproc 'a','id,part,qty','id',1
      

  16.   

    这样怎样在sql语句中用??
    我的需要是:
    select dbo.Fn_General(....),字段....form A
    union all
    select dbo.Fn_General(....),字段....form B
    union all
    ...............
    其中的Fn_General的参数不同!!
      

  17.   

    函数里面肯定拼不了语句,感觉唯一的方法是用if else 转换.....应该有别的变通的解决方法
      

  18.   

    真想不通你为什么一定要用函数,直接写不就好了
    select NewField=(select top 1 field1 from tbName where field2=id),字段....form A
    union all
    select NewField=(select top 1 field1 from tbName where field2=id),字段....form B
    union all
    ...............还有就是函数里不能用Exec、sp_executesql等,所以拼语句是肯定行不通的
      

  19.   

    我的需要是:
    select dbo.Fn_General(....),字段....form A
    union all
    select dbo.Fn_General(....),字段....form B
    union all
    ...............
    其中的Fn_General的参数不同!!那每一行的Fn_General的参数是固定的吧?这样的话只直接写死好了