有关函数求教!

lvyichang 2010-09-03 10:37:07
我现在的函数如下,返回一个值,其中字段名,表明,字段id都是写死的,
能否作为参数传递??请赐教!谢谢!!
我现在的函数:
CREATE FUNCTION dbo.函数名 (@id int)  
RETURNS varchar(20)
AS
BEGIN
declare @myReturn varchar(20)
set @myReturn =(select 字段名 from 表名 where 字段id = @id )
return @myReturn
END
...全文
197 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvyichang 2010-09-04
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hao1hao2hao3 的回复:]
SQL code

declare @s varchar(1000)
select @s= dbo.[Fn_General]('a','id,part,qty','id','1')
exec(@s)

这样就可以了。
[/Quote]
这样怎样在sql语句中用??
我的需要是:
select dbo.Fn_General(....),字段....form A
union all
select dbo.Fn_General(....),字段....form B
union all
...............
其中的Fn_General的参数不同!!
hao1hao2hao3 2010-09-04
  • 打赏
  • 举报
回复
或者用存储过程吧!



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



hao1hao2hao3 2010-09-04
  • 打赏
  • 举报
回复

declare @s varchar(1000)
select @s= dbo.[Fn_General]('a','id,part,qty','id','1')
exec(@s)



这样就可以了。
lvyichang 2010-09-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hao1hao2hao3 的回复:]
#4楼的Josy都说过了。函数中不能执行动态SQL语句的
你用这个语句exec @myReturn
当然会报错了。
[/Quote]
是啊!
就没办法了???
hao1hao2hao3 2010-09-04
  • 打赏
  • 举报
回复
#4楼的Josy都说过了。函数中不能执行动态SQL语句的
你用这个语句exec @myReturn
当然会报错了。
lvyichang 2010-09-04
  • 打赏
  • 举报
回复
谢谢楼上 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'。
lg314 2010-09-04
  • 打赏
  • 举报
回复
函数里面肯定拼不了语句,感觉唯一的方法是用if else 转换.....

应该有别的变通的解决方法
whb147 2010-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lvyichang 的回复:]
我的函数没什么问题!
关键是写死了!
@myReturn是返回值!!
[/Quote]

问题很大呀
如果你的查询有2条记录呢?
你的就会报错呀,兄弟
nightmaple 2010-09-04
  • 打赏
  • 举报
回复
我的需要是:
select dbo.Fn_General(....),字段....form A
union all
select dbo.Fn_General(....),字段....form B
union all
...............
其中的Fn_General的参数不同!!

那每一行的Fn_General的参数是固定的吧?这样的话只直接写死好了
nightmaple 2010-09-04
  • 打赏
  • 举报
回复
真想不通你为什么一定要用函数,直接写不就好了
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等,所以拼语句是肯定行不通的
lvyichang 2010-09-04
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 lg314 的回复:]
函数里面肯定拼不了语句,感觉唯一的方法是用if else 转换.....

应该有别的变通的解决方法
[/Quote]
??
继续求教!!
hao1hao2hao3 2010-09-03
  • 打赏
  • 举报
回复
用cast函数转换一下,把整型转成字符型。
set @myReturn='select '+@field1 +' from '+ @tbName +' where ' +@field2 +' = '+cast(@id as varchar(20))
lvyichang 2010-09-03
  • 打赏
  • 举报
回复
我是这样写的:
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
lvyichang 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hao1hao2hao3 的回复:]
先不要写到函数里面去,你就像我那样的方式先打印(print)出来看看结果是怎么样的。
[/Quote]
也不行!提示:转换成数据类型 int 时失败
hao1hao2hao3 2010-09-03
  • 打赏
  • 举报
回复
先不要写到函数里面去,你就像我那样的方式先打印(print)出来看看结果是怎么样的。
lvyichang 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hao1hao2hao3 的回复:]
其实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
[/Quote]
试了一下,好像不行!!
提示:无法绑定由多个部分组成的标识符
我写的是:
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
hao1hao2hao3 2010-09-03
  • 打赏
  • 举报
回复
其实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

lvyichang 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 josy 的回复:]
不知道是否有误解你的意思,你的意思是否为表名是固定的,
通过调用函数,输入一个字段ID,返回这个字段id对应的字段名称?
[/Quote]
表名不固定,字段不固定,字段ID不固定,
想将这三个值作为参数传递!!
百年树人 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lvyichang 的回复:]
引用 4 楼 josy 的回复:
当表名或者字段名为变量时,需要使用动态SQL,而函数不支持动态SQL
建议使用存储过程来实现

我只要返回一个值!请大大明示!
[/Quote]

不知道是否有误解你的意思,你的意思是否为表名是固定的,
通过调用函数,输入一个字段ID,返回这个字段id对应的字段名称?
华夏小卒 2010-09-03
  • 打赏
  • 举报
回复
这个就直接查询吧,不用函数了
加载更多回复(6)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧