SQl服务器动态查询

时间:2015-11-24 07:20:30

标签: sql-server

我有一张表连接

KEY    Base_TBL   Connected_table     Base_tbl_colmn   Connected_table_colmn
----   ------       -------------     ------------      ------------------
PRM    Table1      Table2,Table3       colm1                 Colm2,colm3
FRN    Table4        table5            colm4                    colm5

我需要生成一个动态Query,它应该提供类似这样的输出

select * from table1 
INNER JOIN Table 2
ON table1.colm1 =table2.colm2
INNER JOIN Table3 
on Table1.colm1=tabl3.colm3

Connected_table中的表数量可以是任何值,我必须在此基础上加入。

我在动态查询中尝试了REPLACE函数,但没有得到所需的结果。

CREATE PROCEDURE [dbo].jointables 
[Key] nvarchar(10)
AS
BEGIN
SET NOCOUNT ON
SET ROWCOUNT 0


DECLARE @sql as nvarchar(4000)

select @sql= 'select * from '+ Base_TBL + 'inner join ' +

请指导我如何进一步

1 个答案:

答案 0 :(得分:1)

CREATE FUNCTION [dbo].[FN_SPLIT](@Long_str varchar(max),@split_str varchar(100))    
RETURNS  @tmp TABLE(        
    ID      inT IDENTITY PRIMARY KEY,      
    SPLIT   varchar(max)    
)    
AS   
BEGIN 
        DECLARE @sxml XML

        SET @sxml='<root><node>'+REPLACE(@Long_str,@split_str,'</node><node>')+'</node></root>'
        INSERT INTO @tmp([SPLIT])
        SELECT b.value('.','varchar(max)') FROM @sxml.nodes('root/node') AS s(b)


    RETURN     
END 
GO

DECLARE @sql as nvarchar(4000)
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
;WITH testdata AS 
(
select 'PRM' AS [Key],'Table1' AS Base_TBL,'Table2,Table3' AS  Connected_table,'colm1' AS Base_tbl_colmn,'Colm2,colm3' AS Connected_table_colmn
)

SELECT * INTO #temp FROM testdata

select @sql= 'select * from '+ Base_TBL +' ' +t.joinstring
FROM #temp
CROSS APPLY (
    SELECT STUFF((
 SELECT ' INNER JOIN '+ ft.[SPLIT] + ' ON ' + Base_TBL+'.'+Base_tbl_colmn +'='+ft.[SPLIT]+'.'+fc.[SPLIT]
FROM 
dbo.FN_SPLIT(Connected_table,',') AS ft 
INNER JOIN dbo.FN_SPLIT(Connected_table_colmn,',') AS fc ON fc.ID=ft.ID
FOR XML PATH('')),1,1,'') AS joinstring
) AS t
SELECT @sql

下面的示例只处理一行 当处理多行时,可以使用另一个东西函数组合多行

SELECT STUFF((
        select  '  select * from '+ Base_TBL +' ' +t.joinstring 
        FROM #temp
        CROSS APPLY (
            SELECT STUFF((
         SELECT ' INNER JOIN '+ ft.[SPLIT] + ' ON ' + Base_TBL+'.'+Base_tbl_colmn +'='+ft.[SPLIT]+'.'+fc.[SPLIT]
        FROM 
        dbo.FN_SPLIT(Connected_table,',') AS ft 
        INNER JOIN dbo.FN_SPLIT(Connected_table_colmn,',') AS fc ON fc.ID=ft.ID
        FOR XML PATH('')),1,1,'') AS joinstring
        ) AS t FOR XML PATH('')
),1,1,'')