Построить временную таблицу с динамическим SQL в SQL Server 2008 - PullRequest
0 голосов
/ 15 октября 2010

Короче говоря ...

Я создаю веб-приложение, в котором пользователь может выбрать любую комбинацию из примерно 40 параметров.Однако для получения одного из желаемых результатов (опыта инвестирования) мне нужно извлечь информацию из другой таблицы и сравнить значения в шести разных столбцах (фондовый опыт, паевые инвестиционные фонды и т. Д.) И получить только самое высокое значение из шести.для этой конкретной записи.

Это не проблема.Проблема в том, что во время выполнения мой запрос на поиск инвестиционного опыта не обязательно знает идентификатор учетной записи.Учитывая, что сканирование таблицы принесет более полумиллиона клиентов, это не вариант.Итак, что я пытаюсь сделать, это отредактировать копию моего основного динамически созданного запроса, но вместо того, чтобы возвращать более 30 столбцов, он просто вернет 2, accountid и experienceid (который является PK для таблицы опыта), поэтому яможет сделать дело о фильтрации.

Некоторые из вас могут определять динамический SQL немного по-другому, чем я.Мой запрос - это строка, которая в зависимости от аргументов, отправляемых в мою процедуру, в части предложения where будут включаться или выключаться переключателями.В конце я выполняю, все это делается на стороне сервера, и все, что делает веб-приложение, - это отправляет массив аргументов моему процессу.

Мой упрощенный код выглядит по существу так:

declare @sql varchar(8000)
set @sql = 
'select [columns]
into #tempTable
from [table]
[table joins]' + @dynamicallyBuiltWhereClause

exec(@sql)

после этой части я пытаюсь использовать #tempTable для процесса фильтрации инвестиционного опыта, но получаю ошибку, сообщающую, что #tempTable не существует.

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 15 октября 2010

Проблема в том, что область действия вашей временной таблицы существует только внутри оператора exec ().Вы можете преобразовать вашу временную таблицу в «глобальную» временную таблицу, используя 2 знака хеша -> ## tempTable.Однако мне интересно, почему вы используете переменную @dynamicallyBuiltWhereClause для генерации вашего оператора SQL.

Я уже делал то, что вы делаете в прошлом, но сгенерировал SQL из приложения с большим успехом (для генерации использовался C #мой SQL).

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

...