cursor.execute: Frage zum dynamischem Einfügen in einen Anweisungsstring eines SQL-Befehls

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
stoeberhai
User
Beiträge: 4
Registriert: Sonntag 12. November 2017, 13:39

Ich möchte eine MS SQL-Datenbank abfragen.
Der Zugang auf die Datenbank und auch die Abfrage funktionieren.

Dort habe ich derzeit "statisch" folgenden String einer cursor.execute()-Anweisung programmiert:

Code: Alles auswählen

cursor.execute("""SELECT convert(NVARCHAR,b.[Posting Date],104) as Datum
	   ,b.[Posting Date]
	   ,[No_] as Artikel#
        ,a.[DescriptionFUll]
	    ,b.[Document No_]
		,b.[Entry Type]
		,"Vorgang" =
		case
	      when [Entry Type]=0 then 'Einkauf'
		  when [Entry Type]=1 then 'Verkauf'
		  when [Entry Type]=2 then 'Zugang'
		  when [Entry Type]=3 then 'Abgang'
		  when [Entry Type]=4 then 'Umlagerung'
		  when [Entry Type]=5 then 'Verbrauch'
		  when [Entry Type]=6 then 'Istmeldung'
		  when [Entry Type]=7 then 'N.N'
		  when [Entry Type]=8 then 'Verbrauch für Montage'
		  when [Entry Type]=9 then 'Montage-Istmeldung'
		end
		,cast(round(b.[Quantity],2,2) as real) as Menge
      ,[Base Unit of Measure]
      ,cast(round([Unit Cost],2) as real) as 'EuroProEinheit'
      ,[Blocked]
      ,cast(round([Lot Size],2,2) as real) as Losgröße
      ,cast(round([Safety Stock Quantity],2,2)as real) as Sich_Bestand     
	  ,[Zeichnungsnummer]
      ,[Inventur]
      ,[Blocked Purchase]
FROM [Mustermann BC].[dbo].[Mustermann_GmbH$Item] as a
   LEFT JOIN [Mustermann BC].[dbo].[Mustermann_GmbH$Item Ledger Entry] AS b ON a.No_ = b.[Item No_]
where No_ like '894204'""")
Die (Artikel-)Nummer, in diesem Fall 894204, nach dem "No_ like " in der letzten Zeile möchte ich aber dynamisch in den Abfragestring einfügen, so daß ich im Batchbetrieb dieses Python-Script mit beliebigen Artikel-Nummern aufrufen kann.
Wie geht das?
stoeberhai
User
Beiträge: 4
Registriert: Sonntag 12. November 2017, 13:39

Im folgenden habe ich der Vollständigkeit halber meinen Code noch um die am Anfang gemachten imports erweitert:

Code: Alles auswählen

import sys
from os import getenv
import pymssql
import time
import numpy as np
import array
from re import sub
import openpyxl
import subprocess

# Definition vo Variablen und Felder
...
conn = pymssql.connect(server="server" , user="mustermann", password="passwort")
cursor = conn.cursor()
cursor.execute("""SELECT convert(NVARCHAR,b.[Posting Date],104) as Datum
	   ,b.[Posting Date]
	   ,[No_] as Artikel#
        ,a.[DescriptionFUll]
	    ,b.[Document No_]
		,b.[Entry Type]
		,"Vorgang" =
		case
	      when [Entry Type]=0 then 'Einkauf'
		  when [Entry Type]=1 then 'Verkauf'
		  when [Entry Type]=2 then 'Zugang'
		  when [Entry Type]=3 then 'Abgang'
		  when [Entry Type]=4 then 'Umlagerung'
		  when [Entry Type]=5 then 'Verbrauch'
		  when [Entry Type]=6 then 'Istmeldung'
		  when [Entry Type]=7 then 'N.N'
		  when [Entry Type]=8 then 'Verbrauch für Montage'
		  when [Entry Type]=9 then 'Montage-Istmeldung'
		end
		,cast(round(b.[Quantity],2,2) as real) as Menge
      ,[Base Unit of Measure]
      ,cast(round([Unit Cost],2) as real) as 'EuroProEinheit'
      ,[Blocked]
      ,cast(round([Lot Size],2,2) as real) as Losgröße
      ,cast(round([Safety Stock Quantity],2,2)as real) as Sich_Bestand     
	  ,[Zeichnungsnummer]
      ,[Inventur]
      ,[Blocked Purchase]
FROM [Mustermann BC].[dbo].[Mustermann_GmbH$Item] as a
   LEFT JOIN [Mustermann BC].[dbo].[Mustermann_GmbH$Item Ledger Entry] AS b ON a.No_ = b.[Item No_]
where No_ like '894204'""")

stoeberhai
User
Beiträge: 4
Registriert: Sonntag 12. November 2017, 13:39

:idea: Mittlerweile weiß ich wie es geht und möchte anderen Suchenden die Lösung präsentieren:

Code: Alles auswählen

Artikelnummer='894204'  
# ^^^^^^^^^^^^^^^^^^^
# "Artikelnummer" als Variable
conn = pymssql.connect(server="server" , user="mustermann", password="passwort")
cursor = conn.cursor()
cursor.execute("""SELECT convert(NVARCHAR,b.[Posting Date],104) as Datum
       ,b.[Posting Date]
       ,a.[No_] as Artikel#
        ,a.[DescriptionFUll]
        ,b.[Document No_]
        ,b.[Entry Type]
        ,"Vorgang" =
        case
          when [Entry Type]=0 then 'Einkauf'
          when [Entry Type]=1 then 'Verkauf'
          when [Entry Type]=2 then 'Zugang'
          when [Entry Type]=3 then 'Abgang'
          when [Entry Type]=4 then 'Umlagerung'
          when [Entry Type]=5 then 'Verbrauch'
          when [Entry Type]=6 then 'Istmeldung'
          when [Entry Type]=7 then 'N.N'
          when [Entry Type]=8 then 'Verbrauch für Montage'
          when [Entry Type]=9 then 'Montage-Istmeldung'
        end
        ,cast(round(b.[Quantity],2,2) as real) as Menge
      ,[Base Unit of Measure]
      ,cast(round([Unit Cost],2) as real) as 'EuroProEinheit'
      ,a.[Blocked]
      ,cast(round([Lot Size],2,2) as real) as Losgröße
      ,cast(round([Safety Stock Quantity],2,2)as real) as Sich_Bestand     
      ,[Zeichnungsnummer]
      ,[Inventur]
      ,[Blocked Purchase]
      ,Lieferant.No_
      ,Lieferant.Name
      ,Lieferant.City
FROM [Mustermann].[dbo].[Mustermann_GmbH$Item] as a
   LEFT JOIN [Mustermann].[dbo].[Mustermann_GmbH$Item Ledger Entry] AS b ON a.No_ = b.[Item No_]
   LEFT JOIN [Mustermann].[dbo].[Mustermann_GmbH$Vendor] as Lieferant on a.[Vendor No_] = Lieferant.No_
   where a.No_ like %s""", Artikelnummer)
#                   ^^     ^^^^^^^^^^^^^
#  Format-String mit nachfolgender Belegung des Platzhalters
Antworten