2011-01-28 2 views
0

Это мой пример sql-запроса в хранимой процедуре, которая работает нормально. Но я хочу, чтобы передать значения концессии, что здесь «TH-003853199» и имя таблицы динамически ..ошибка в хранимой процедуре

SELECT @source = source,@stage = stage 
     FROM BABMwork8_22_1210_0012.dbo.concessions 
     WHERE concession = 'TH-003853199' 

и хранимая процедура, EDIT в запросе

ALTER PROCEDURE status_in_other_db 
        @other_db VARCHAR(50), 
        @concession VARCHAR(30) 
     AS 
    BEGIN 
      SET NOCOUNT ON 

     DECLARE @query VARCHAR(8000), 
       @other_db_con VARCHAR(80), 
       @source VARCHAR(10), 
       @stage VARCHAR(50), 
       @status_in_other_db VARCHAR(50) 

     SET @other_db_con = @other_db + '.dbo.concessions' ; 
     SET @query = ('SELECT @source = source,@stage = stage FROM ' + @other_db_con + ' WHERE concession = '''[email protected]+''' ') 
      EXEC(@query) 
     IF(@source!='PARK') 
    BEGIN 
     SET @status_in_other_db = 
     CASE @stage 
      WHEN 'Open' THEN 'Open' 
      WHEN 'Archive' THEN 'Archived' 
      WHEN 'R4invoicing' THEN 'Ready for invoicing' 
      WHEN 'N2Bdetermined' THEN'SplitBA' 
      WHEN 'Invoiced' THEN 'Invoiced' 
      WHEN 'Exclusion' THEN'Exclusion' 
     END 
    END 
ELSE IF(@source='PARK') 
    SET @status_in_other_db = 'PARK' 
ELSE IF(@source='') 
    SET @status_in_other_db = 'Not present' 

SELECT @status_in_other_db as status_in_other_db 
END 

Здесь я хочу вернуть значение @status_in_other_db обратно, что должно быть моим выходным параметром.

При выполнении этой хранимой процедуры я получаю ошибку: - должна быть объявлена ​​скалярная переменная @source.

Eventhough я изменен так, теперь я не получаю сообщение об ошибке, ни результаты ...

SET @query = 'DECLARE @source VARCHAR(10), @stage VARCHAR(50) ' 

SET @query = @query + 'SELECT @source = source,@stage = stage 
    FROM BABMwork8_22_1210_0012.dbo.concessions 
    WHERE concession = ''TH-003853199'' ' 

пожалуйста, помогите мне

ответ

2

Вы используете @query в назначение @query

SET @query = @query + 'SELECT @source = source,@stage = stage 
    FROM BABMwork8_22_1210_0012.dbo.concessions 
    WHERE concession = ''TH-003853199'' ' 

Поскольку @query не инициализируется @query является недействительным и не будет аннулирована после того, как вы добавите выберите заявление @query. Вместо этого замените это.

SET @query = 'SELECT @source = source,@stage = stage 
    FROM BABMwork8_22_1210_0012.dbo.concessions 
    WHERE concession = ''TH-003853199'' ' 

При попытке что вы получите сообщение об ошибке

Must declare the scalar variable "@Source"

Вы не можете использовать переменные в динамическом SQL, потому что они не находятся в области от EXEC. Как сказал gbn, вам нужно использовать временную таблицу. Сделайте динамический SQL сделать вставку во временную таблицу, которую вы ранее создали в хранимой процедуре.

create table #Temp (Source varchar(10), Stage varchar(50)) 

После выполняется динамический SQL можно назначить @Source и @Stage от #Temp

select @Source = Source, @Stage = Stage from #Temp 
+0

+1, Thanku verymuch. Это работало как шарм. Я также благодарен за поэтапную процедуру :-) – satya

1

@source не в объеме, когда динамический запрос выполняется , AKA динамическая область запроса отличается от области хранимой процедуры.

Вам нужно будет использовать временную таблицу для передачи данных и динамического запроса.

Хотя, я не знаю, почему нужно @Source в любом случае вы не используете его

Этот ответ подчиняется обычным предостережений о SQL Injection и т.д.

Смежные вопросы