【问题标题】:How to run sql query using python and pandas如何使用 python 和 pandas 运行 sql 查询
【发布时间】:2020-02-24 10:15:30
【问题描述】:

我刚刚创建了如下查询:

/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all views */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped View: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all functions */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

因为这个查询在sql 中执行时工作正常,但是当我厌倦了使用 python 执行时,我得到了一个错误。

所以现在我需要使用 python 运行这个查询,如下代码:

from database import connec
import pandas as pd

def delete_all_tables_from_db():
    delete_all_tables_query = "/* Drop all non-system stored procs */ " \
                              + "DECLARE @name VARCHAR(128) " \
    + "DECLARE @SQL VARCHAR(254) " \
    + "SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name]) " \
    + "WHILE @name is not null " \
    + "BEGIN " \
    + "SELECT @SQL = 'DROP PROCEDURE [dbo].[N' + QUOTENAME(@name) +N']' " \
    + "EXEC (@SQL) " \
    + "PRINT 'Dropped Procedure: ' + @name " \
    + "SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name]) " \
    + "END " \
    + "GO " \
    + "/* Drop all views */ " \
    + "DECLARE @name VARCHAR(128) " \
    + "DECLARE @SQL VARCHAR(254) " \
    + "SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name]) " \
    + "WHILE @name IS NOT NULL " \
    + "BEGIN " \
    + "SELECT @SQL = 'DROP VIEW [dbo].[N' + QUOTENAME(@name) +N']' " \
    + "EXEC (@SQL) " \
    + "PRINT 'Dropped View: ' + @name " \
    + "SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name]) " \
    + "END " \
    + "GO " \
    + "/* Drop all functions */ " \
    + "DECLARE @name VARCHAR(128) " \
    + "DECLARE @SQL VARCHAR(254) " \
    + "SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name]) " \
    + "WHILE @name IS NOT NULL " \
    + "BEGIN " \
    + "SELECT @SQL = 'DROP FUNCTION [dbo].[N' + QUOTENAME(@name) +N']' " \
    + "EXEC (@SQL) " \
    + "PRINT 'Dropped Function: ' + @name " \
    + "SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name]) " \
    + "END " \
    + "GO " \
    + "/* Drop all Foreign Key constraints */ " \
    + "DECLARE @name VARCHAR(128) " \
    + "DECLARE @constraint VARCHAR(254) " \
    + "DECLARE @SQL VARCHAR(254) " \
    + "SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME) " \
    + "WHILE @name is not null " \
    + "BEGIN " \
    + "SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) " \
    + "WHILE @constraint IS NOT NULL " \
    + "BEGIN " \
    + "SELECT @SQL = 'ALTER TABLE [dbo].[' + QUOTENAME(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']' " \
    + "EXEC (@SQL) " \
    + "PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name " \
    + "SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) " \
    + "END " \
    + "SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME) " \
    + "END " \
    + "GO " \
    + "/* Drop all Primary Key constraints */ " \
    + "DECLARE @name VARCHAR(128) " \
    + "DECLARE @constraint VARCHAR(254) " \
    + "DECLARE @SQL VARCHAR(254) " \
    + "SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME) " \
    + "WHILE @name IS NOT NULL " \
    + "BEGIN " \
    + "SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) " \
    + "WHILE @constraint is not null " \
    + "BEGIN " \
    + "SELECT @SQL = 'ALTER TABLE [dbo].[' + QUOTENAME(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']' " \
    + "EXEC (@SQL) " \
    + "PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name " \
    + "SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) " \
    + "END " \
    + "SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME) " \
    + "END " \
    + "GO " \
    + "/* Drop all tables */ " \
    + "DECLARE @name VARCHAR(128) " \
    + "DECLARE @SQL VARCHAR(254) " \
    + "SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name]) " \
    + "WHILE @name IS NOT NULL " \
    + "BEGIN " \
    + "SELECT @SQL = 'DROP TABLE [dbo].[N' + QUOTENAME(@name) +N']' " \
    + "EXEC (@SQL) " \
    + "PRINT 'Dropped Table: ' + @name " \
    + "SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name]) " \
    + "END " \
    + "GO"

    delete_all_tables_df = pd.read_sql(delete_all_tables_query, connec.engine)
    connec.engine.execute(delete_all_tables_df)

delete_all_tables_from_db()

我发现了这个错误:

Traceback (most recent call last):
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 1245, in _execute_context
    self.dialect.do_execute(
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\default.py", line 588, in do_execute
    cursor.execute(statement, parameters)
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102) (SQLExecDirectW); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@constraint' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102)")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:/Users/haroo501/PycharmProjects/ToolUpdated/database/delete_all_tables_from_db.py", line 93, in <module>
    delete_all_tables_from_db()
  File "C:/Users/haroo501/PycharmProjects/ToolUpdated/database/delete_all_tables_from_db.py", line 90, in delete_all_tables_from_db
    delete_all_tables_df = pd.read_sql(delete_all_tables_query, connec.engine)
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\io\sql.py", line 432, in read_sql
    return pandas_sql.read_query(
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\io\sql.py", line 1218, in read_query
    result = self.execute(*args)
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\io\sql.py", line 1087, in execute
    return self.connectable.execute(*args, **kwargs)
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 2182, in execute
    return connection.execute(statement, *multiparams, **params)
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 976, in execute
    return self._execute_text(object_, multiparams, params)
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 1143, in _execute_text
    ret = self._execute_context(
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 1249, in _execute_context
    self._handle_dbapi_exception(
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 1476, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\util\compat.py", line 398, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\util\compat.py", line 152, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\base.py", line 1245, in _execute_context
    self.dialect.do_execute(
  File "C:\Users\haroo501\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\engine\default.py", line 588, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102) (SQLExecDirectW); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@constraint' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@name' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The variable name '@SQL' has already been declared. Variable names must be unique within a query batch or stored procedure. (134); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'GO'. (102)")
[SQL: /* Drop all non-system stored procs */ DECLARE @name VARCHAR(128) DECLARE @SQL VARCHAR(254) SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name]) WHILE @name is not null BEGIN SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']' EXEC (@SQL) PRINT 'Dropped Procedure: ' + @name SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name]) END GO /* Drop all views */ DECLARE @name VARCHAR(128) DECLARE @SQL VARCHAR(254) SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name]) WHILE @name IS NOT NULL BEGIN SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']' EXEC (@SQL) PRINT 'Dropped View: ' + @name SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name]) END GO /* Drop all functions */ DECLARE @name VARCHAR(128) DECLARE @SQL VARCHAR(254) SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name]) WHILE @name IS NOT NULL BEGIN SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']' EXEC (@SQL) PRINT 'Dropped Function: ' + @name SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name]) END GO /* Drop all Foreign Key constraints */ DECLARE @name VARCHAR(128) DECLARE @constraint VARCHAR(254) DECLARE @SQL VARCHAR(254) SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME) WHILE @name is not null BEGIN SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) WHILE @constraint IS NOT NULL BEGIN SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']' EXEC (@SQL) PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) END SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME) END GO /* Drop all Primary Key constraints */ DECLARE @name VARCHAR(128) DECLARE @constraint VARCHAR(254) DECLARE @SQL VARCHAR(254) SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME) WHILE @name IS NOT NULL BEGIN SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) WHILE @constraint is not null BEGIN SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']' EXEC (@SQL) PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME) END SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME) END GO /* Drop all tables */ DECLARE @name VARCHAR(128) DECLARE @SQL VARCHAR(254) SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name]) WHILE @name IS NOT NULL BEGIN SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']' EXEC (@SQL) PRINT 'Dropped Table: ' + @name SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name]) END GO]
(Background on this error at: http://sqlalche.me/e/f405)

那么如何使用长查询来用python执行它

【问题讨论】:

标签: python sql-server pandas


【解决方案1】:

您的代码正在通过字符串连接创建动态 sql,但在我看来,您缺少所有换行符,导致单行 T-SQL。如果没有正确分隔,这可能会导致语法错误。

有两种方法可以解决此问题:

1) 在字符串中使用换行符以创建与原始语法相同的字符串。示例:

delete_all_tables_query = "/* Drop all non-system stored procs */ \n" \
                              + "DECLARE @name VARCHAR(128) \n" \
    + "DECLARE @SQL VARCHAR(254) \n" \
    + "SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name]) \n" \
    + "WHILE @name is not null \n" \
    + "BEGIN \n" \
    + "SELECT @SQL = 'DROP PROCEDURE [dbo].[N' + QUOTENAME(@name) +N']' \n" \
    + "EXEC (@SQL) \n" \
[etc...]

2) 创建一个存储过程来运行您的代码并在 python 代码中调用它。示例:

CREATE PROCEDURE EmptyDatabase
AS
BEGIN
    /* Drop all non-system stored procs */
    DECLARE @name VARCHAR(128)
    DECLARE @SQL VARCHAR(254)
    DECLARE @constraint VARCHAR(254)

    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])

    WHILE @name is not null
    BEGIN
        SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
        EXEC (@SQL)
        PRINT 'Dropped Procedure: ' + @name
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
    END


    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])

    WHILE @name IS NOT NULL
    BEGIN
        SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
        EXEC (@SQL)
        PRINT 'Dropped View: ' + @name
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
    END


    /* Drop all functions */
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

    WHILE @name IS NOT NULL
    BEGIN
        SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
        EXEC (@SQL)
        PRINT 'Dropped Function: ' + @name
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
    END


    /* Drop all Foreign Key constraints */

    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

    WHILE @name is not null
    BEGIN
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
        WHILE @constraint IS NOT NULL
        BEGIN
            SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
            EXEC (@SQL)
            PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
            SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
        END
    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
    END


    /* Drop all Primary Key constraints */
    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

    WHILE @name IS NOT NULL
    BEGIN
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
        WHILE @constraint is not null
        BEGIN
            SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
            EXEC (@SQL)
            PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
            SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
        END
    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
    END


    /* Drop all tables */
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

    WHILE @name IS NOT NULL
    BEGIN
        SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
        EXEC (@SQL)
        PRINT 'Dropped Table: ' + @name
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
    END

END

然后:

def delete_all_tables_from_db():
    delete_all_tables_query = 'exec EmptyDatabase'
    connec.engine.execute(delete_all_tables_query)

delete_all_tables_from_db()

请注意,您的 SQL 语法实际上并不返回任何记录集,因此在这两种解决方案中您都无需读取任何内容,只需执行 sql 字符串即可。

正如某人已经评论的那样,您也可以删除数据库并重新创建它,假设应用程序具有必要的权限。

不过,我想知道这一切有什么用,因为数据库用于保存数据,而用于清空/删除它的代码只能使用一次 :) 我唯一能想到的是基于 Python 的 Sql Server管理工作室 XD

【讨论】:

  • 我非常感谢您的帮助,并感谢您的帮助,因此关于删除数据库我尝试使用DROP DATABASE [toolDB],但DROP DATABASE statement cannot be used inside a user transaction.出现错误您对如何操作有任何想法吗假设申请用户许可,这个解决方案似乎更好,我很高兴帮助我:)..
  • 你是什么意思,“基于Python的Sql Server Management Studio”你的意思是最好的SQL环境是SQL Server Managment Studio??对,或者我可以使用其他 sql 环境?
猜你喜欢
  • 2019-01-22
  • 1970-01-01
  • 2018-02-21
  • 2018-11-05
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
相关资源
最近更新 更多