Как использовать заменить в операторе Exec в SQL Server 2008 - PullRequest
6 голосов
/ 27 октября 2010

У меня есть сохраненный процесс, скажем, "call_Me" с несколькими параметрами:

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

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

во время разговора я хочу иметь возможность заменить

||User||

немного с чем-то другим. обычно в операторе выбора я бы сделал это:

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

, который работает нормально, но сегодня я впервые пытаюсь использовать его в операторе exec, ошибка говорит о ожидаемом выборе, я пытался добавлять выбор всеми возможными (и разумными) способами, но это просто потренироваться.

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

Большое спасибо заранее!

Ответы [ 3 ]

3 голосов
/ 27 октября 2010

Вам нужно отформатировать @Greet перед передачей его 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
2 голосов
/ 27 октября 2010

Вы можете использовать только литерал или ссылку на переменную в вызове процедуры:

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

Используйте это:

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

Exec Call_Me 1,'something', @param
0 голосов
/ 27 октября 2010

Я не уверен, правильно ли я понимаю вашу проблему, но, возможно, с помощью курсора решит вашу проблему:

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

Если вам не нужно для его вызова в цикле , вы можете попробовать что-то вроде (это может быть новая хранимая процедура):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...