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)

解决方案 »

  1.   


    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
      

  2.   

    直观的更改如下:
    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 
      

  3.   

    function不支持动态语句,想法有问题
      

  4.   

    现在的问题是把
    select @str=@str+','+Rtrim(@valueColumnName) from @tableName where  
    charindex(','+ltrim(@IdColumnName)+',' , ','+ltrim (@Ids)+',')>0
    拼成一个字符串,再去执行
    这能行得通吗
    @str,这个参数不好处理
      

  5.   


    我需要实现这样的目的:
    如:
    select fruit, tree, functionC('1,2,3') from farm_table
    得到
    apple, appleTree, 'person1,person2,person3
    存储过程能达到这个效果吗
      

  6.   

    需求就像我在9楼描述的这样
    有一个农场
    我现在要知道种苹果树的是哪些人
    人是存在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, '张三,李四,王五'
      

  7.   

    我第一个function就是基于这种目的做的
    但是对于另一张表,另一个字段,也有这样的需求
    如果每种这种情况都去写一个function,那这样实在太不智能了
      

  8.   

    函数是不能 Exec 的.
    看函数的相关资料.存储过程是可以实现的.
    首先拼出 查询数据的SQL语句
    然后执行就可以了.
    Declare @Script nvarchar(max)
    Select @Script = 'Select * From ' + @TabName
    Exec @Script 
      

  9.   

    CREATE TABLE  A (KeyA INT, ValueA CHAR(10))
    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 行受影响)
      

  10.   

    没细看你的问题.....
    如果你的是MSSQL2005 那么 google 一下 行列转换 会得到你要的结果
      

  11.   

    看看能不能用语句实现的如for xml path 之类的不用函数。
      

  12.   

    认真看了下Function和Procedcure的资料
    Function 可以嵌在SQL语句中直接得出一个结果
    但不支持动参
    Procedure 支持动参,不能放在select中去执行
    所以
    感觉这两个东西还不够智能,不能满足我的需求