|
6 | 6 | from django.db.models.functions import Cast |
7 | 7 | from django.db.models.functions.math import ATan2, Log, Ln, Mod, Round |
8 | 8 | from django.db.models.expressions import Case, Exists, OrderBy, When |
9 | | -from django.db.models.lookups import Lookup |
| 9 | +from django.db.models.lookups import Lookup, In |
10 | 10 |
|
11 | 11 | DJANGO3 = VERSION[0] >= 3 |
12 | 12 |
|
@@ -91,11 +91,29 @@ def sqlserver_orderby(self, compiler, connection): |
91 | 91 | return self.as_sql(compiler, connection, template=template) |
92 | 92 |
|
93 | 93 |
|
| 94 | +def split_parameter_list_as_sql(self, compiler, connection): |
| 95 | + # Insert In clause parameters 1000 at a time into a temp table. |
| 96 | + lhs, _ = self.process_lhs(compiler, connection) |
| 97 | + _, rhs_params = self.batch_process_rhs(compiler, connection) |
| 98 | + |
| 99 | + with connection.cursor() as cursor: |
| 100 | + cursor.execute("IF OBJECT_ID('tempdb.dbo.#Temp_params', 'U') IS NOT NULL DROP TABLE #Temp_params; ") |
| 101 | + cursor.execute("CREATE TABLE #Temp_params (params int)") |
| 102 | + for offset in range(0, len(rhs_params), 1000): |
| 103 | + sqls_params = rhs_params[offset: offset + 1000] |
| 104 | + sqls_params = ", ".join("({})".format(item) for item in sqls_params) |
| 105 | + cursor.execute("INSERT INTO #Temp_params VALUES %s" % sqls_params) |
| 106 | + |
| 107 | + in_clause = lhs + ' IN ' + '(SELECT params from #Temp_params)' |
| 108 | + |
| 109 | + return in_clause, () |
| 110 | + |
94 | 111 | ATan2.as_microsoft = sqlserver_atan2 |
95 | 112 | Log.as_microsoft = sqlserver_log |
96 | 113 | Ln.as_microsoft = sqlserver_ln |
97 | 114 | Mod.as_microsoft = sqlserver_mod |
98 | 115 | Round.as_microsoft = sqlserver_round |
| 116 | +In.split_parameter_list_as_sql = split_parameter_list_as_sql |
99 | 117 |
|
100 | 118 | if DJANGO3: |
101 | 119 | Lookup.as_microsoft = sqlserver_lookup |
|
0 commit comments