2016-03-29 34 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语句,您可以使用批处理。 –

相关问题