其实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
试了一下,好像不行!! 提示:无法绑定由多个部分组成的标识符 我写的是: 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
先不要写到函数里面去,你就像我那样的方式先打印(print)出来看看结果是怎么样的。
也不行!提示:转换成数据类型 int 时失败
我是这样写的: 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
用cast函数转换一下,把整型转成字符型。 set @myReturn='select '+@field1 +' from '+ @tbName +' where ' +@field2 +' = '+cast(@id as varchar(20))
谢谢楼上 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'。
或者用存储过程吧!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
这样怎样在sql语句中用?? 我的需要是: select dbo.Fn_General(....),字段....form A union all select dbo.Fn_General(....),字段....form B union all ............... 其中的Fn_General的参数不同!!
函数里面肯定拼不了语句,感觉唯一的方法是用if else 转换.....应该有别的变通的解决方法
真想不通你为什么一定要用函数,直接写不就好了 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等,所以拼语句是肯定行不通的
我的需要是: select dbo.Fn_General(....),字段....form A union all select dbo.Fn_General(....),字段....form B union all ............... 其中的Fn_General的参数不同!!那每一行的Fn_General的参数是固定的吧?这样的话只直接写死好了
字符串-->"(select 字段名 from 表名 where 字段id = @id )" ??
还是想得到select的结果集?
如果是结果集,你这样写应该是不行的,可以定义@myReturn为recordset类型,接受结果集,或者借助临时表存放结果集就可以了。
建议使用存储过程来实现
关键是写死了!
@myReturn是返回值!!
如:select ‘a' from ....
你只要得到“a”这个值就可以了么?如果我理解的不对,麻烦LZ举个例子,写点测试数据,然后写出你想要的结果,谢谢。
不知道是否有误解你的意思,你的意思是否为表名是固定的,
通过调用函数,输入一个字段ID,返回这个字段id对应的字段名称?
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
提示:无法绑定由多个部分组成的标识符
我写的是:
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
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
set @myReturn='select '+@field1 +' from '+ @tbName +' where ' +@field2 +' = '+cast(@id as varchar(20))
用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'。
你用这个语句exec @myReturn
当然会报错了。
declare @s varchar(1000)
select @s= dbo.[Fn_General]('a','id,part,qty','id','1')
exec(@s)这样就可以了。
@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
我的需要是:
select dbo.Fn_General(....),字段....form A
union all
select dbo.Fn_General(....),字段....form B
union all
...............
其中的Fn_General的参数不同!!
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等,所以拼语句是肯定行不通的
select dbo.Fn_General(....),字段....form A
union all
select dbo.Fn_General(....),字段....form B
union all
...............
其中的Fn_General的参数不同!!那每一行的Fn_General的参数是固定的吧?这样的话只直接写死好了