Cum să solicitați utilizatorului unei interogări SQL să introducă informații (Programare, Server Sql, Variabile, Prompt De Comandă, Prompt)

Vbasic4now a intrebat.

Am o interogare pe care am scris-o în SQL server și care va fi rulată în principal de persoane care nu cunosc SQL și există două zone care trebuie să aibă un șir sau o dată diferită introdusă de fiecare dată când interogarea este rulată. Deocamdată, am scris-o astfel încât să introduc informația în partea de sus a interogării și să fie stocată ca o variabilă. Există o modalitate prin care pot face ca SQL să solicite persoanei care execută interogarea să introducă datele? Mai jos este un extras din codul care conține ceea ce vreau să spun.

declare 
/*ENTER ACCOUNTING MONTH*/     
   @amon VARCHAR(2) = '05',
/*ENTER INVOICE DATE IN MM/DD/YYYY FORMAT*/
   @invdate DATE = '05/31/2015'
~~
rest of the code
~~
declare @sumA numeric(25, 5), @sumB numeric(25, 5), @ratio numeric(25, 5)
select @sumA = sum(amnt) from accnt where accno = '1152'
select @sumB = sum(amnt) from acc1152
update acc1152 set amnt = amnt * (@sumA/@sumB),
amon = @amon,
invdate = @invdate,
ven = '1152',
code = '1152',
invno = 'INVENTORY'

Deci, este posibil ca SQL să solicite utilizatorului să introducă valoarea pentru @amon și @invdate? În afară de faptul că eu am doar o linie de comentariu care să îi spună să facă acest lucru?

Comentarii

  • Va fi foarte amuzant dacă utilizatorul va introduce „drop database databaseName”. să fac o aplicație care să solicite introducerea de către utilizator… –  > Por Giorgi Nakeuri.
  • ar fi amuzant, dar ar fi evident cine a făcut-o, așa că nu-mi fac griji că se va întâmpla asta. și ce fel de aplicație? singurele cunoștințe reale de codare pe care le am sunt SQL de bază. –  > Por Vbasic4now.
  • Nu, nu este posibil. SQL Server NU este un front-end. Este un server de baze de date. Acesta nu este un acces. Dacă doriți un prompt trebuie să fie dintr-o aplicație. –  > Por Sean Lange.
  • OK, mulțumesc. Aveți vreo sugestie de unde ar trebui să încep în această privință? –  > Por Vbasic4now.
5 răspunsuri
Giorgi Nakeuri

În cazul în care nu poți face o aplicație, nu ai dezvoltatori etc etc etc, ai o singură soluție – să faci un stored proc:

create stored procedure spDoSomeJob
@amon VARCHAR(2),
@invdate DATE
as
begin

    ~~
    rest of the code
    ~~
    declare @sumA numeric(25, 5), @sumB numeric(25, 5), @ratio numeric(25, 5)
    select @sumA = sum(amnt) from accnt where accno = '1152'
    select @sumB = sum(amnt) from acc1152
    update acc1152 set amnt = amnt * (@sumA/@sumB),
    amon = @amon,
    invdate = @invdate,
    ven = '1152',
    code = '1152',
    invno = 'INVENTORY'

end

Refuzați orice permisiune de activitate pentru utilizatori cu excepția doar a executării acestei proceduri. Executați-o în felul următor:

exec spDoSomeJob  @amon = '05', @invdate = '05/31/2015'

Cel puțin veți fi siguri că niciun utilizator nu poate corupe ocazional ceva… Și dacă nu veți furniza valori pentru parametrii procedurii stocate, aceasta vă va solicita să faceți acest lucru, cu excepția cazului în care nu aveți valori implicite pentru acești parametri. Mi se pare cea mai bună soluție pentru cazul dumneavoastră.

Comentarii

  • vă mulțumesc foarte mult! aceasta pare a fi cea mai bună soluție. –  > Por Vbasic4now.
  • Dacă instruiți utilizatorul să facă clic dreapta pe procedura stocată și să facă clic pe Execute Stored Procedure…, atunci utilizatorului i se va solicita o fereastră GUI frumoasă pentru a vedea și a introduce toți parametrii necesari pentru procedura stocată. stackoverflow.com/a/52107123/8595398 –  > Por Matthew.
Alex

Ați putea, poate, să apelați această interogare dintr-un alt limbaj de programare? SQL nu este eficient pentru sarcina pe care o descrieți. Un limbaj de nivel înalt, cum ar fi Python/Java/C#, ți-ar permite să soliciți cu ușurință introducerea de date de către utilizator și ar fi, fără îndoială, mai potrivit pentru această sarcină.

Dacă doriți cu adevărat să faceți ceva în SQL și folosesc SSMS, atunci puteți folosi SSMS șabloane și să lăsați utilizatorii să introducă valorile parametrilor folosind CTRL+SHIFT+M, deși eu aș descuraja această abordare.

Comentarii

  • Execut această interogare prin AnySQL Maestro pentru baze de date, este posibil să folosiți un alt limbaj cu acest program? dacă da, sunt dispus să încerc. Doar că singurele cunoștințe reale de codare pe care le am sunt SQL, iar acestea sunt destul de limitate –  > Por Vbasic4now.
  • @samhatcher Tot ce aveți nevoie este un limbaj care are drivere pentru SQL Server, care va fi majoritatea limbajelor moderne. AnySQL Maestro este pur și simplu un instrument de conectare și interogare a bazelor de date, deci nu are niciun impact asupra limbii pe care o alegeți. –  > Por Alex.
Stan

După cum au menționat și alții, SQL Server și Management Studio nu sunt concepute ca instrumente pentru utilizatorii finali.

Din moment ce utilizați SQL SERVER, aveți un instrument (poate că nu este instalat și configurat) numit SQL Server Reporting Services (SSRS).

Acesta face are capacitatea de a solicita utilizatorilor valori pentru parametri.

Interogarea dvs. intră în Report Designer, variabilele @ devin filtre de raport (destul de automat) și puteți face o punere în pagină frumoasă.

Hârtia și tipărirea nu sunt implicate. De fapt, SSRS este specializat în crearea unui raport în altul, transmițând valori de pornire pentru următoarea interogare.

Comentarii

  • De fapt, SSRS ar fi încântat chiar să consume procedura stocată pe care ați făcut-o între timp pe baza răspunsului acceptat 😉 –  > Por Stan.
Jon Bushey

O altă soluție este să folosiți PowerShell pentru a cere utilizatorului date de intrare și apoi să treceți aceste date către scriptul dvs. pe măsură ce este executat de PowerShell. Pe calculatorul utilizatorului, s-ar putea să fie nevoie să instalați unele extensii PowerShell pentru ca acesta să poată rula TSQL. Cum ar fi import-module sqlps. PowerShell nu este pentru cei slabi de inimă, dar este gratuit și astfel ați putea să-l încercați fără un angajament mare.

Subiect Stackoverflow

Fandango68

Eu folosesc TOAD pentru SQL Server, unde puteți defini „câmpuri de intrare în timp de execuție” ca parte a scriptului dvs.

De ex.

select * from myTable AS m where m.ID = :MyValue

:MyValue este parametrul tău, iar când TOAD rulează comanda SQL, va solicita utilizatorului să introducă o valoare din mers. Este păcat că SSMS nu oferă această caracteristică.