Невозможно запросить и поместить данные внутри курсора при использовании переменной внутри запроса - PullRequest
0 голосов
/ 10 июля 2020

Мне нужно поместить результат запроса (извлекается один столбец и значение) в переменную. Я пытаюсь использовать курсор, однако я выбираю базу данных для запроса на основе переменной, вот мой запрос

SELECT productName, price FROM @ShopName.dbo.Products WHERE ProductName = @ProductName

Переменная @ ShopName сначала извлекается из базы данных и назначается переменной с помощью курсора . Переменная @ProductName заполняется входным параметром, поступающим из API. Мне нужно получить ProductName из указанной c базы данных (есть несколько баз данных с продуктами), но приведенный выше запрос вызывает синтаксические ошибки. Кроме того, когда я пробовал ad ho c запрос, назначенный переменной:

SET @Sql = N'SELECT productName, price FROM ' + QUOTENAME(@ShopName) + '.dbo.Products WHERE ProductName = ' + @ProductName

, он не позволяет использовать его в

DECLARE cursorT CURSOR
FOR
@Sql

Это вызывает Incorrect syntax near '@Sql', Expecting '(', SELECT, or WITH

Есть ли способ сделать возможным использование этого запроса в курсоре при использовании переменной с именем базы данных в нем?

1 Ответ

2 голосов
/ 10 июля 2020

Курсоры должны быть в самом низу вашего набора методов, использоваться экономно и с большой осторожностью, только когда это необходимо. Я не могу сказать, нужно ли это в вашем случае, кода недостаточно знать. Но я хотел выговорить это, прежде чем продолжить.

Из чисто академического c интереса, да, есть несколько способов сделать это. Два основных способа:

  1. Объявить курсор в динамике c SQL, как предложил Дейл. Вы все еще можете использовать курсор в коде stati c, который следует за объявлением, если курсор является глобальным.
  2. Используйте Dynami c SQL, чтобы перетащить результаты во что-то с областью видимости за пределами динамики c sql, как временная таблица. Курсор над временной таблицей.

1 просто плохо. Скорее всего, в результате получится код, который в будущем будет чрезвычайно трудно понять. Включаю только из любопытства. 2. Разумно.

Примеры:

-- some dummy schema and data to work with
create table t(i int); 
insert t values(1), (2);

-- option 1: declare a cursor dynamically, use it statically (don't do this)

declare @i int;
exec sp_executesql N'declare c cursor global for select i from t';
open c;
fetch next from c into @i;
while (@@fetch_status = 0) 
begin
    print @i;
    fetch next from c into @i;
end
close c;
deallocate c;

-- option 2: dynamically dump data to a table, eg a temp table

create table #u(i int);
exec sp_executesql N'insert #u (i) select i from t';
declare c cursor local for select i from #u;
declare @i int;
open c;
fetch next from c into @i;
while (@@fetch_status = 0) 
begin
    print @i;
    fetch next from c into @i;
end
close c;
deallocate c;
...