web-dev-qa-db-fra.com

Comment inviter un utilisateur de requête SQL à saisir des informations

J'ai une requête que j'ai écrite dans SQL Server qui sera exécutée principalement par des personnes qui ne connaissent pas SQL, et il y a deux zones qui doivent avoir une chaîne ou une date différente entrée chaque fois que la requête est exécutée. En ce moment, je viens de l'écrire pour que vous saisissiez les informations en haut de la requête et leur stockées sous forme de variable. Existe-t-il un moyen d'obtenir SQL pour inviter la personne exécutant la requête à entrer les données? ci-dessous est un extrait du code qui contient ce dont je parle.

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'

est-il donc possible pour SQL d'inviter l'utilisateur à saisir la valeur de @amon et @invdate? à part moi juste avoir la ligne de commentaires leur disant de le faire?

7
Vbasic4now

Dans le cas où vous ne pouvez pas faire une application, vous n'avez pas de développeurs etc etc, vous avez une façon - faire un proc stocké:

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

Refuser toutes les autorisations d'activité pour les utilisateurs, à l'exception de l'exécution de cette procédure. Exécutez-le comme:

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

Au moins, vous serez sûr qu'aucun utilisateur ne peut occasionnellement corrompre quelque chose ... Et si vous ne fournissez pas de valeurs aux paramètres de la procédure stockée, il vous demandera de le faire à moins que vous n'ayez aucune valeur par défaut pour ces paramètres. Il me semble que la meilleure solution de contournement pour votre cas.

8
Giorgi Nakeuri

Comme d'autres l'ont mentionné, SQL Server et Management Studio ne sont pas conçus comme des outils pour l'utilisateur final.

Étant donné que vous utilisez SQL SERVER, vous disposez d'un outil (peut-être pas installé et configuré) appelé SQL Server Reporting Services (SSRS).

Il fait a la capacité de demander aux utilisateurs des valeurs pour les paramètres.

Votre requête va dans le Report Designer, les variables @ deviennent des filtres de rapport (assez automatiquement) et vous obtenez une belle mise en page.

PAPIER et IMPRESSION ne sont pas impliqués. En fait, SSRS est spécialisé dans un rapport explorant un autre, transmettant les valeurs de départ pour la requête suivante.

2
Stan

Une autre solution consiste à utiliser PowerShell pour demander à l'utilisateur de saisir des informations, puis transmettre ces données à votre script lors de son exécution par PowerShell. Sur l'ordinateur de l'utilisateur, vous devrez peut-être installer certaines extensions PowerShell pour qu'il puisse exécuter TSQL. Comme les sqlps du module d'importation. PowerShell n'est pas pour les faibles de cœur mais il est gratuit et vous pouvez donc l'essayer sans un grand engagement.

Sujet Stackoverflow

2
Jon Bushey

Pourriez-vous peut-être appeler cette requête à partir d'un autre langage de programmation? SQL n'est pas efficace pour la tâche que vous décrivez. Un langage de haut niveau tel que Python/Java/C # vous permettrait de demander facilement une entrée utilisateur et serait sans doute plus adapté au travail.

Si vous voulez vraiment faire quelque chose en SQL et qu'ils utilisent SSMS, vous pouvez utiliser SSMS modèles et laisser les utilisateurs entrer les valeurs des paramètres à l'aide de CTRL + SHIFT + M, bien que je décourage cette approche.

2
Alex

J'utilise TOAD pour SQL Server, où vous pouvez définir des "champs d'entrée d'exécution" dans le cadre de votre script.

c'est à dire.

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

:MyValue est votre paramètre et lorsque TOAD exécute la commande SQL, il invite l'utilisateur à saisir une valeur à la volée. C'est dommage que SSMS n'offre pas cette fonctionnalité.

0
Fandango68