I have this script below. I left out the connection details for security purposes but the code executes with out error in python and in MS SQL 2019
import pandas as pd
import pyodbc
sqlInsertScript = """
SELECT 'INSERT INTO dbo.table(' +
    STUFF ((
        SELECT ', [' + name + ']'
        FROM syscolumns
        WHERE id = OBJECT_ID('dbo.table') AND
            name <> 'me'
        FOR XML PATH('')), 1, 1, '') +
    ') 
Select ' +
    STUFF ((
        SELECT ', [' + name + ']'
        FROM syscolumns
        WHERE id = OBJECT_ID('dbo.table') AND
            name <> 'me'
        FOR XML PATH('')), 1, 1, '') + ' 
From dbo.QueryPerformance
where EntryID > Number'
"""
insertquery = pd.read_sql_query(sqlInsertScript,cnxn1)
My issue is that this query returns 0 None in python. I need it to return the string I am creating because I intend to use that query going forward. I know the query works it returns correct text when run from MSSQL SSMS.
Advertisement
Answer
I used pyodbc instead of pandas and your code worked for me.
import pyodbc
import pandas as pd
def connectToDatabase():   
    '''
    Connect to the SQL Server. Note the insecurity here
    '''
    try:
        conn = pyodbc.connect('Driver={SQL Server};'
                              r'your server;'
                              'Database=your db;'
                              'uid=your uid;'
                              'pwd=your pw;')
    except Exception as e: 
        print(e)
        conn = None
    return conn
def getQuery():
    '''
    The query we use to extract data from our SQL Server
    '''
    # This can't go wrong so we don't need error handling
    query = """
SELECT 'INSERT INTO dbo.table(' +
    STUFF ((
        SELECT ', [' + name + ']'
        FROM syscolumns
        WHERE id = OBJECT_ID('dbo.table') AND
            name <> 'me'
        FOR XML PATH('')), 1, 1, '') +
    ') 
Select ' +
    STUFF ((
        SELECT ', [' + name + ']'
        FROM syscolumns
        WHERE id = OBJECT_ID('dbo.table') AND
            name <> 'me'
        FOR XML PATH('')), 1, 1, '') + ' 
From dbo.QueryPerformance
where EntryID > Number'
"""
    return query
conn = connectToDatabase()
cursor = conn.cursor()
# Submit a query to the SQL Server instance and store the results in the cursor object
cursor.execute(getQuery())
for row in cursor:
    print(row)
The output:
('INSERT INTO dbo.table( [A], [B], [C]) nSelect  [A], [B], [C] nFrom dbo.QueryPerformancenwhere EntryID > Number', )
Here is the table I cobbled for this test case:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table](
    [A] [nchar](10) NULL,
    [B] [real] NULL,
    [C] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO