summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/databases/mssql.py
diff options
context:
space:
mode:
authorMichael Trier <mtrier@gmail.com>2009-01-02 18:24:57 +0000
committerMichael Trier <mtrier@gmail.com>2009-01-02 18:24:57 +0000
commitf793a88403c01600c45958290bec54bebced5a28 (patch)
treea72eb17dc16bf526751782dd90f17b7b104d7e0a /lib/sqlalchemy/databases/mssql.py
parent9c83fafc27b3d144265db7a1b28d9dbda9a6c354 (diff)
downloadsqlalchemy-f793a88403c01600c45958290bec54bebced5a28.tar.gz
Added ability to use subselects within INSERTS on mssql.
Diffstat (limited to 'lib/sqlalchemy/databases/mssql.py')
-rw-r--r--lib/sqlalchemy/databases/mssql.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py
index 265150413..5ad2a9306 100644
--- a/lib/sqlalchemy/databases/mssql.py
+++ b/lib/sqlalchemy/databases/mssql.py
@@ -1494,6 +1494,33 @@ class MSSQLCompiler(compiler.DefaultCompiler):
return self.process(expression._BinaryExpression(binary.left, binary.right, op), **kwargs)
return super(MSSQLCompiler, self).visit_binary(binary, **kwargs)
+ def visit_insert(self, insert_stmt):
+ insert_select = False
+ if insert_stmt.parameters:
+ insert_select = [p for p in insert_stmt.parameters.values() if isinstance(p, sql.Select)]
+ if insert_select:
+ self.isinsert = True
+ colparams = self._get_colparams(insert_stmt)
+ preparer = self.preparer
+
+ insert = ' '.join(["INSERT"] +
+ [self.process(x) for x in insert_stmt._prefixes])
+
+ if not colparams and not self.dialect.supports_default_values and not self.dialect.supports_empty_insert:
+ raise exc.NotSupportedError(
+ "The version of %s you are using does not support empty inserts." % self.dialect.name)
+ elif not colparams and self.dialect.supports_default_values:
+ return (insert + " INTO %s DEFAULT VALUES" % (
+ (preparer.format_table(insert_stmt.table),)))
+ else:
+ return (insert + " INTO %s (%s) SELECT %s" %
+ (preparer.format_table(insert_stmt.table),
+ ', '.join([preparer.format_column(c[0])
+ for c in colparams]),
+ ', '.join([c[1] for c in colparams])))
+ else:
+ return super(MSSQLCompiler, self).visit_insert(insert_stmt)
+
def label_select_column(self, select, column, asfrom):
if isinstance(column, expression._Function):
return column.label(None)