我现在有若干个表,表的个数不确定,她们的结构相同,
想把他们结合到一个表中,其中fun是自定义函数,它的返回值是和参数相关的表,如果是2个表我可以用
select a.* from(from * from fun(5) union all select * from fun(8))a来实现,可是现在的情况是我根本不清楚有多少个这样的表,外界程序中会通过条件筛选得到一个 5 8  10  12 等一组数据,接着把它们放入fun的参数中,想通过类似的union all方法得到最后的结果
不知道怎么做了。

解决方案 »

  1.   

    有没有可以在sql语句中就进行拼接的方法呢?
      

  2.   

    declare @m varchar(100)
    declare @s varchar(1000)
    declare @a table(ID int)
    select @m='5,8,10,12',@s='select a.* from('
    set @m='select '+replace(@m,',',' union select ')
    insert @a exec(@m)
    select @s=@s+'select * from fun('+ltrim(id)+') union all ' from @a
    set @s=left(@s,len(@s)-10)+')t'
    exec(@s)
      

  3.   

    额。。因为不确定表的个数,union all了1000多张表,导致拼接的sql语句过长大约20万个字符结果就。。请问有什么解决方案吗?
      

  4.   

    创建一个自定义函数动态生成需要的sql语句CREATE FUNCTION dbo.Fun_GetSql(@tableCommonName VARCHAR(50),@tableCount INT)
    RETURNS VARCHAR(MAX)
    BEGIN
    DECLARE @tableLoopId INT
    DECLARE @sql VARCHAR(MAX)

    SET @tableLoopId = 1
    SET @sql = ''

    WHILE(@tableLoopId <= @tableCount)
    BEGIN

    SET @sql += 'SELECT * '+
    'FROM '+ @tableCommonName + LTRIM(RTRIM(STR(@tableLoopId) ))

    IF (@tableLoopId < @tableCount)
    BEGIN
    SET @sql += '  UNION ALL '
    END
    SET @tableLoopId += 1
    END
    RETURN @sql 
    END