pymssql выполнить запрос из предыдущего запроса - PullRequest
0 голосов
/ 04 марта 2019

Как выполнить запрос по результатам предыдущего запроса с pymssql?

Это то, что я пытался:

from os import getenv
import pymssql
import pandas as pd
import arcpy
import csv
from decimal import Decimal
from functools import partial
import time
from datetime import datetime

####### connect to DB #######
conServer = r"myserver\myserver"
condb = "some database"

conn = pymssql.connect(server=conServer, database=condb)
cursor = conn.cursor()

##### query 1 #####
query1 = "DECLARE 
             SOMETHING
          SELECT 
             SOME FIELDS 
          FROM 
             dbo.SOMETABLE 
          WHERE 
             SOME CONDITIONS"

resQuery1 = cursor.execute(query1)

##### query 2 #####
query2 = """DECLARE @something TINYINT = 1
                            ;WITH VARIABLE1 AS (
    SELECT
        SOME FIELDS
    FROM
        SOME TABLES WITH A BUNCH OF JOINS
    WHERE
        SOME CONDITIONS
    GROUP BY
        FIELD2
        ), FIELD3 AS (
        SELECT
            THIS,
            Sum(THAT) as SUMTHAT
        FROM %s 
        GROUP BY
            FIELD2
        )
        SELECT
            REST OF THE QUERY"""

cursor.execute(query2,  (resQuery1))

попытка передать% s не сработала.

Я также пытался сохранить результаты запроса в таблице in_memory с использованием arcpy, поскольку мне пришлось в конечном итоге выполнить это в ArcGIS Server со следующим кодом:

########## in memory table
gis_temp_loc_loss_adj = "temp_loc_loss_adj" + datestamp
query1Table = arcpy.CreateTable_management(r"in_memory", gis_temp_loc_loss_adj)

columnNames = tuple(map(str, [i[0] for i in cursor.description]))

addfield = partial(
    arcpy.AddField_management,
    query1Table
    )

for field in columnNames:
    addfield(field)

with arcpy.da.InsertCursor(query1Table, columnNames) as insCur:
    for row in cursor:
        insCur.insertRow(row)

Но я не могу найтиспособ прочитать имя таблицы in_memory и включить его в SQL-запрос.

Что я делаю неправильно в cursor.execute, что он не получает% s?В качестве альтернативы, как я могу сохранить результат query1 в памяти и использовать его в query2?

Чтобы уточнить, я не могу писать на сервере sql и не могу создавать временные таблицы в базе данных SQL

...