2016-03-29 65 views
1

我目前的目標是創建動態選擇和查詢。在我們的例子中,我們有一個參考表。引用表包含引用列值和表名。我們使用這些引用在其他表上創建一個動態查詢。例如:什麼是大規模動態選擇和查詢的最佳實踐

select * from {table} where {pk1} in (...) and {pk2} in {...} 

生成的查詢存在問題。問題是某些行在結果中返回,但它們不在查詢中,因爲在查詢中有不同的條件。

更改SQL生成喜歡這個

select * from {table} where ({pk1}=(value1) and {pk2}=(value2)) or ({pk1}=(value3) and {pk2}=(value4)) ...) 

在這種情況下,問題解決了,但查詢執行時間是不好的,而不是「IN」的查詢。它慢了大約10-20倍。查詢字符串太大而不是「IN」查詢。

我們不能使用表值查詢,因爲我們無法動態地爲每個表創建一個新的TYPE,並且這些列的類型和順序不同。未來可能會插入新的表格類型。

那麼,最好的做法是什麼?

問候

+0

有多少值在「in」子句中?例如{pk1}在(1,2,3,......,10000) –

+0

這取決於引用的表。當前在一個表中大約有50k行 –

回答

-1

我想,你可以在 「在」 這樣的語句中使用臨時表,

IF (OBJECT_ID('tempdb..#tid') IS NULL) 
    BEGIN 
    CREATE TABLE #tid(Id BIGINT); 
    INSERT INTO #tid (Id) VALUES (1), 
     (2), 
     (3), 
     (4), 
     (5), 
     (6), 
     (7), 
     (8), 
     --...... 
     (10000); 
    END 
select * from {table} where {pk1} in (SELECT Id FROM #tid); 

這種用法快於「在(1,2,3,4,... ,10000)。

+0

他/她詢問SELECT語句,對於INSERT和UPDATE語句,您可以使用批處理。 –

相關問題