2015-10-16 88 views
0

我想動態生成查詢。我寫了一些條件,生成動態查詢

DECLARE @NewLineChar AS CHAR(2) = CHAR(13) + CHAR(10) 

DECLARE @MyTable TABLE(
    FormTypeID int NOT NULL, 
    TableName NVARCHAR(100), 
    pk NVARCHAR(50)); 

INSERT INTO @MyTable(FormTypeID, TableName, pk) 
    VALUES (0, N'Table1', 'ParentID'), 
      (5, N'Table2', 'ID'), 
      (5, N'Table3', 'ParentID'), 
      (5, N'Table4','ParentID'), 
      (3, N'Table5','ParentID') 

DECLARE @SQLJoin varchar(8000) = 'LEFT JOIN (SELECT t.* FROM ParentTable t ' + @NewLineChar, 
     @pk nvarchar(100); 


SELECT @SQLJoin += ' INNER JOIN ' + TableName +' ON ' + TableName + '.' + pk + ' = t.ID' + @NewLineChar FROM @MyTable 
    WHERE FormTypeID IN (0,5) 

PRINT @SQLJoin + ')'; 

這是結果:

LEFT JOIN (SELECT t.* FROM ParentTable t 
INNER JOIN Table1 ON Table1.ParentID = t.ID 
INNER JOIN Table2 ON Table2.ID = t.ID 
INNER JOIN Table3 ON Table3.ParentID = t.ID 
INNER JOIN Table4 ON Table4.ParentID = t.ID 
) 

我希望它看起來像這樣以嵌套的聯接取決於FormTypeID:

LEFT JOIN (SELECT t.* FROM ParentTable t 
INNER JOIN Table1 ON Table1.ParentID = t.ID) 
LEFT JOIN (SELECT t.* FROM ParentTable t 
INNER JOIN Table2 ON Table2.ID = t.ID 
INNER JOIN Table3 ON Table3.ParentID = t.ID 
INNER JOIN Table4 ON Table4.ParentID = t.ID 
) 
+0

沒有爲你工作?那麼請關閉 –

回答

0

我想我找到解決方案

DECLARE @NewLineChar AS CHAR(2) = CHAR(13) + CHAR(10), @Param NVARCHAR(100) = '0,5'; 

DECLARE @MyTable TABLE(
    FormTypeID int NOT NULL, 
    TableName NVARCHAR(100), 
    PK NVARCHAR(50)); 

INSERT INTO @MyTable(FormTypeID, TableName, PK) 
    VALUES (0, N'Table1', 'ParentID'), 
      (5, N'Table2', 'ID'), 
      (5, N'Table3', 'ParentID'), 
      (5, N'Table4','ParentID'), 
      (3, N'Table5','ParentID') 


DECLARE @SQLString varchar(8000) = '', 
     @SQLJoin varchar(8000) = 'LEFT JOIN (SELECT t.* FROM ParentTable t ' + @NewLineChar; 

SELECT @SQLString += 
    @SQLJoin + 
    (SELECT 
     ' INNER JOIN ' + A.TableName +' ON ' + A.TableName + '.' + A.PK + ' = t.ID' + @NewLineChar 
     FROM @MyTable AS A 
    WHERE A.FormTypeID = CAST(B.Data AS INT) FOR XML PATH (''), TYPE).value('.', 'varchar(max)') + ')' 
FROM dbo.Split(@Param,',') AS B 

PRINT @SQLString 

拆分只是表值函數,它派生2個參數和返回數據表格式

+0

如果你可以找到更好的解決方案,只需發佈​​它,我非常感興趣...... – www1986

0

只需做你的選擇兩次:一次爲FormTypeID = 0一次FormTypeID = 5

這應該給你想要的結果

set nocount on 
DECLARE @NewLineChar AS CHAR(2) = CHAR(13) + CHAR(10) 

DECLARE @MyTable TABLE(
    FormTypeID int NOT NULL, 
    TableName NVARCHAR(100), 
    pk NVARCHAR(50)); 

INSERT INTO @MyTable(FormTypeID, TableName, pk) 
    VALUES (0, N'Table1', 'ParentID'), 
      (5, N'Table2', 'ID'), 
      (5, N'Table3', 'ParentID'), 
      (5, N'Table4','ParentID'), 
      (3, N'Table5','ParentID') 

DECLARE @SQLJoin varchar(MAX) = 'LEFT JOIN (SELECT t.* FROM ParentTable t ' + @NewLineChar, @pk nvarchar(100); 

SELECT @SQLJoin += ' INNER JOIN ' + TableName +' ON ' + TableName + '.' + pk + ' = t.ID)' + @NewLineChar FROM @MyTable WHERE FormTypeID = 0 

SELECT @SQLJoin += 'LEFT JOIN (SELECT t.* FROM ParentTable t ' + @NewLineChar 
SELECT @SQLJoin += ' INNER JOIN ' + TableName +' ON ' + TableName + '.' + pk + ' = t.ID' + @NewLineChar FROM @MyTable WHERE FormTypeID = 5 
SELECT @SQLJoin += ')'; 
PRINT @SQLJoin; 

PRINT '--' + @NewLineChar 

DECLARE @SQLOutput varchar(8000) = ''; 

select @SQLOutput += 'LEFT JOIN (SELECT t.* FROM ParentTable t ' + @NewLineChar 
select @SQLOutput += ' INNER JOIN Table1 ON Table1.ParentID = t.ID)' + @NewLineChar 
select @SQLOutput += 'LEFT JOIN (SELECT t.* FROM ParentTable t ' + @NewLineChar 
select @SQLOutput += ' INNER JOIN Table2 ON Table2.ID = t.ID' + @NewLineChar 
select @SQLOutput += ' INNER JOIN Table3 ON Table3.ParentID = t.ID' + @NewLineChar 
select @SQLOutput += ' INNER JOIN Table4 ON Table4.ParentID = t.ID' + @NewLineChar 
select @SQLOutput += ')'; 


print @SQLOutput 

select case when @SQLOutput = @SQLJoin then 1 else 0 end 
+0

這個問題,假設FormTypeID的值來自過程參數。我不想寫這麼多的案例,我認爲有一個選擇 – www1986

+0

@ www1986解決方案我對給定的信息做出瞭解決方案。如果您需要不同的解決方案,我需要更多信息。 –

+0

我想動態地寫這個字符串,而不是那麼多+ =操作符; – www1986