SQL 函数,表字段名为变量。。

时间:2022-04-05 20:09:06
Create FUNCTION [dbo].[GetWBSDate](@AA varchar(100),@BB varchar(100))
RETURNS varchar(2000)
AS  
BEGIN 


declare @sql varchar(8000)
declare @WBSDate varchar(100)

select @WBSDate=@BB from mainview where CODE=@AA


return @WBSDate

END


这样写如果 select dbo.GetWBSDate('aaa','abc')  返回的结果是...字段名 'abc' 而不是值。。

14 个解决方案

#1


select @WBSDate=@BB from mainview where CODE=@AA

你把@BB赋值给@WBSDate当然就是'abc'

应该
select @WBSDate=列名 from mainview where CODE=@AA

#2


,@BB varchar(100)
可以省去

#3


我的列名想赋值为变量

比如 select @BB from mainview where CODE=@AA
然后把搜索出来的值 返回给@WBSDate

#4


去看看表值函数..

#5


引用 3 楼 just_april 的回复:
我的列名想赋值为变量

比如 select @BB from mainview where CODE=@AA
然后把搜索出来的值 返回给@WBSDate

@BB是列名?动态的取哪一列吗,那就得动态的sql了

#7


@BB是列名...动态取某列的值,如何在函数中写。。

#8


引用 7 楼 just_april 的回复:
@BB是列名...动态取某列的值,如何在函数中写。。


用存储过程吧,函数不支持exec来执行动态的sql

#9


这。。。问题就麻烦了,你还得判断传入的字符串对不对,或者不存在此列名之类的。。

#10


恩..那暂且列名是一定存在。。这个变量如何写呢。

#11


--> 数据库版本:
--> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
--> 测试数据:表A
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'表A') 
AND type in (N'U')) 
DROP TABLE 表A
GO

---->建表
create table 表A([Department] int,[Mode] varchar(1))
insert 表A
select 1,'a' union all
select 1,'b' union all
select 1,'c' union all
select 2,'a' union all
select 2,'a'
GO



declare @aa varchar(200)='1'  ,@bb varchar(200) ='[Mode]'
declare @sql varchar(4000)
set @sql = 'select '+@bb + ' from 表A where Department = '+@aa
exec (@sql)



--> 查询结果
SELECT * FROM 表A


--> 删除表格
--DROP TABLE 表A

#12


函数中不能写 exec  吧。。

#13


引用 7 楼 just_april 的回复:
@BB是列名...动态取某列的值,如何在函数中写。。

有那么复杂?那就要用到EXEC了,不过没见过那么复杂的,呵呵。
你可以用case when  THEN end;中间来灵活处理一下下。。。

#14


使用exec 执行动态SQL
要返回值 得用output,sp_executesql

declare @i int
declare @aa varchar(200)='1'  ,@bb varchar(200) ='[Mode]'
declare @sql varchar(4000)
set @sql = 'select @bb ' into @i from 表A where Department = '+@aa
--exec (@sql)
exec sp_executesql @sql,N' @bb varchar(20),@i int',@bb='[Mode]',@i output

#1


select @WBSDate=@BB from mainview where CODE=@AA

你把@BB赋值给@WBSDate当然就是'abc'

应该
select @WBSDate=列名 from mainview where CODE=@AA

#2


,@BB varchar(100)
可以省去

#3


我的列名想赋值为变量

比如 select @BB from mainview where CODE=@AA
然后把搜索出来的值 返回给@WBSDate

#4


去看看表值函数..

#5


引用 3 楼 just_april 的回复:
我的列名想赋值为变量

比如 select @BB from mainview where CODE=@AA
然后把搜索出来的值 返回给@WBSDate

@BB是列名?动态的取哪一列吗,那就得动态的sql了

#6


#7


@BB是列名...动态取某列的值,如何在函数中写。。

#8


引用 7 楼 just_april 的回复:
@BB是列名...动态取某列的值,如何在函数中写。。


用存储过程吧,函数不支持exec来执行动态的sql

#9


这。。。问题就麻烦了,你还得判断传入的字符串对不对,或者不存在此列名之类的。。

#10


恩..那暂且列名是一定存在。。这个变量如何写呢。

#11


--> 数据库版本:
--> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
--> 测试数据:表A
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'表A') 
AND type in (N'U')) 
DROP TABLE 表A
GO

---->建表
create table 表A([Department] int,[Mode] varchar(1))
insert 表A
select 1,'a' union all
select 1,'b' union all
select 1,'c' union all
select 2,'a' union all
select 2,'a'
GO



declare @aa varchar(200)='1'  ,@bb varchar(200) ='[Mode]'
declare @sql varchar(4000)
set @sql = 'select '+@bb + ' from 表A where Department = '+@aa
exec (@sql)



--> 查询结果
SELECT * FROM 表A


--> 删除表格
--DROP TABLE 表A

#12


函数中不能写 exec  吧。。

#13


引用 7 楼 just_april 的回复:
@BB是列名...动态取某列的值,如何在函数中写。。

有那么复杂?那就要用到EXEC了,不过没见过那么复杂的,呵呵。
你可以用case when  THEN end;中间来灵活处理一下下。。。

#14


使用exec 执行动态SQL
要返回值 得用output,sp_executesql

declare @i int
declare @aa varchar(200)='1'  ,@bb varchar(200) ='[Mode]'
declare @sql varchar(4000)
set @sql = 'select @bb ' into @i from 表A where Department = '+@aa
--exec (@sql)
exec sp_executesql @sql,N' @bb varchar(20),@i int',@bb='[Mode]',@i output