2010-10-27 5 views
6

J'ai une procédure stockée, par exemple, « call_Me » avec quelques paramètres:comment l'utilisation remplacer dans l'instruction exec dans SQL Server 2008

Declare @Greet varchar(100) = 'Hi ||User||' 

Exec Call_Me 1,'something', @Greet --parameters: bit, string, string 

pendant l'appel, je veux être en mesure de remplacer le

||User|| 

bit avec autre chose. En règle générale, dans une instruction select, je ferais ceci:

select 1, 'something', Replace(@Greet, '||User||', u.Username) from UserTable 

qui fonctionne très bien, mais aujourd'hui, pour la première fois, je suis en train de l'utiliser dans l'instruction exec, l'erreur dit son attendant sélection, j'ai essayé en ajoutant sélectionner de toutes les manières possibles (et raisonnables) mais cela n'a pas l'air de marcher.

Comment puis-je utiliser un remplacement lors d'un appel d'instruction d'exécution?

Merci beaucoup d'avance!

+0

Pourriez-vous donner un exemple d'appel de procédure stockée avec remplacement? Voulez-vous appeler ce SP en boucle (pour de nombreux noms d'utilisateurs)? –

+0

que SP insère simplement les données données dans une table, mais vérifie une certaine validation et des clés étrangères sur le chemin .. – iamserious

Répondre

3

Vous auriez besoin de formater @Greet avant de passer à la sproc:

Declare @Greet varchar(100) = 'Hi ||User||' 
SELECT @Greet = Replace(@Greet, '||User||', u.Username) 
FROM UserTable u 
WHERE Id = 1 

Exec Call_Me 1,'something', @Greet --parameters: bit, string, string 
+0

Je pense à cela, mais l'inconvénient est qu'une fois que je remplace la chaîne d'origine, || utilisateur || ne sera plus là, donc je ne peux pas l'utiliser à nouveau. mais je pense que je vais le faire avec une autre variable. Merci. – iamserious

2

Vous ne pouvez utiliser un littéral ou une référence variable dans un appel de procédure:

[ { EXEC | EXECUTE } ] 
    { 
     [ @return_status= ] 
     { module_name [ ;number ] | @module_name_var } 
     [ [ @parameter= ] { value 
          | @variable [ OUTPUT ] 
          | [ DEFAULT ] 
          } 
     ] 
     [ ,...n ] 
     [ WITH RECOMPILE ] 
    } 
[;] 

Utilisez cette :

Declare @Greet varchar(100) = 'Hi ||User||' 
Declare @param VARCHAR(100) = REPLACE(@Greet, '||User||', 'replacement') 

Exec Call_Me 1,'something', @param 
+0

merci beaucoup. – iamserious

0

Je ne sais pas si je comprends bien votre problème, mais peut-être l'aide du curseur permet de résoudre votre problème:

DECLARE CURSOR users LOCAL FAST_FORWARD FOR 
    SELECT 
     username 
    FROM 
     usertable 

OPEN 

DECLARE @username NVARCHAR(50) 
DECLARE @Greet VARCHAR(100) = 'Hi ||User||' 

FETCH NEXT FROM users INTO @username 

WHILE @@FETCH_STATUS = 0 BEGIN 

    EXEC Call_Me 1, 'something', REPLACE(@Greet, '||User||', @username) 

    FETCH NEXT FROM users INTO @username 
END 

CLOSE users 
DEALLOCATE users 

Si vous n'avez pas besoin pour appeler en boucle vous pouvez essayer quelque chose comme (cela peut être une nouvelle procédure stockée):

DECLARE @username NVARCHAR(50) 
DECLARE @Greet VARCHAR(100) = 'Hi ||User||' 

SELECT 
    @username = username 
FROM 
    usernames 
WHERE 
    user_id = 1 

IF @@ROWCOUNT = 1 BEGIN 
    EXEC Call_Me 1, 'something', REPLACE(@Greet, '||User||', @username) 
END