function的目的:通过一窜ID值,获得一串列名值,如:通过(1,2,3)获得(tom,lily,lucy)
以下是我以前做的一个function
CREATE FUNCTION [findCrewNames]
(@originCrewIds varchar(800))
RETURNS nvarchar(4000)
WITH EXECUTE AS CALLER
AS
BEGIN
declare @str nvarchar(4000)
set @str = ''
select @str=@str+','+Rtrim(crewName) from mats.crew where charindex(','+ltrim(crewId)+',' , ','+ltrim (@originCrewIds)+',')>0
set @str = CASE WHEN @str = ''THEN '' ELSE right(@str , len(@str) - 1) END
return @str
END但是这个function不够智能,只能查特定表的特定字段
我现在要实现表,和列名都是动态传递的
如把 表mats.crew 改为 动态参数 @tableName
把 列crewName 改为 动态参数 @valueColumnName
列crewId 改为 动态参数 @IdColumnName
想实现的目的就是对任一表,只要我把参数列名,参数列值,参数返回列名 和参数表名,传进来,我就可以获得一串我想要的结果。
即,要动态的实现通过(1,2,3)获得(tom,lily,lucy)
以下是我以前做的一个function
CREATE FUNCTION [findCrewNames]
(@originCrewIds varchar(800))
RETURNS nvarchar(4000)
WITH EXECUTE AS CALLER
AS
BEGIN
declare @str nvarchar(4000)
set @str = ''
select @str=@str+','+Rtrim(crewName) from mats.crew where charindex(','+ltrim(crewId)+',' , ','+ltrim (@originCrewIds)+',')>0
set @str = CASE WHEN @str = ''THEN '' ELSE right(@str , len(@str) - 1) END
return @str
END但是这个function不够智能,只能查特定表的特定字段
我现在要实现表,和列名都是动态传递的
如把 表mats.crew 改为 动态参数 @tableName
把 列crewName 改为 动态参数 @valueColumnName
列crewId 改为 动态参数 @IdColumnName
想实现的目的就是对任一表,只要我把参数列名,参数列值,参数返回列名 和参数表名,传进来,我就可以获得一串我想要的结果。
即,要动态的实现通过(1,2,3)获得(tom,lily,lucy)
CREATE FUNCTION [findCrewNames]
(
@originCrewIds varchar(800),
@tableName varchar(8000) --其他参数类似
)
RETURNS nvarchar(4000)
WITH EXECUTE AS CALLER
AS
BEGIN
declare @str nvarchar(4000)
set @str = '' --注意下边加表名参数的格式!
select @str=@str+','+Rtrim(crewName) from '+@tableName+' where charindex(','+ltrim(crewId)+',' , ','+ltrim (@originCrewIds)+',')>0
set @str = CASE WHEN @str = ''THEN '' ELSE right(@str , len(@str) - 1) END
return @str
END
CREATE FUNCTION [fetchValuesFromIds]
(@tableName varchar(100),@IdColumnName varchar(100), @valueColumnName varchar(
100), @Ids varchar(800))
RETURNS nvarchar(4000)
AS
BEGIN
declare @str nvarchar(4000)
set @str = ''
select @str=@str+','+Rtrim(@valueColumnName) from @tableName where
charindex(','+ltrim(@IdColumnName)+',' , ','+ltrim (@Ids)+',')>0
set @str = CASE WHEN @str = ''THEN '' ELSE right(@str , len(@str) - 1) END
return @str
END但是在创建的时候报错,没有定义表@tableName
select @str=@str+','+Rtrim(@valueColumnName) from @tableName where
charindex(','+ltrim(@IdColumnName)+',' , ','+ltrim (@Ids)+',')>0
拼成一个字符串,再去执行
这能行得通吗
@str,这个参数不好处理
我需要实现这样的目的:
如:
select fruit, tree, functionC('1,2,3') from farm_table
得到
apple, appleTree, 'person1,person2,person3
存储过程能达到这个效果吗
有一个农场
我现在要知道种苹果树的是哪些人
人是存在person这张表中的
在Fram表里存了中苹果树的人的ID集:1,2,3
在person表中这样呈现
id name
1 张三
2 李四
3 王五
--------
select fruit, tree, functionC('1,2,3') from farm_table where fruit='apple'
得到结果
apple, appleTree, '张三,李四,王五'
但是对于另一张表,另一个字段,也有这样的需求
如果每种这种情况都去写一个function,那这样实在太不智能了
看函数的相关资料.存储过程是可以实现的.
首先拼出 查询数据的SQL语句
然后执行就可以了.
Declare @Script nvarchar(max)
Select @Script = 'Select * From ' + @TabName
Exec @Script
GO
CREATE TABLE B (KeyB INT, ValueB CHAR(10))
GO
CREATE PROCEDURE GetData
(
@TabName nvarchar(100),
@FieldName nvarchar(100)
)
AS
DECLARE @Script NVARCHAR(max)
SET @Script = 'Select ' + @FieldName + ' From ' + @TabName
EXEC (@Script)GO
EXEC GetData 'A', 'KeyA'
EXEC GetData 'A', 'ValueA'
EXEC GetData 'B', '*'DROP TABLE A
GO
DROP TABLE B
GO
DROP PROCEDURE GetData
Go运行结果 (MSSQL2005)
------------------------------------
KeyA
-----------
(0 行受影响)
ValueA
----------
(0 行受影响)
KeyB ValueB
----------- ----------
(0 行受影响)
如果你的是MSSQL2005 那么 google 一下 行列转换 会得到你要的结果
Function 可以嵌在SQL语句中直接得出一个结果
但不支持动参
Procedure 支持动参,不能放在select中去执行
所以
感觉这两个东西还不够智能,不能满足我的需求