2010-10-15 1 views
0

Чтобы сделать длинную историю короткой ...Построить временную таблицу с динамическим SQL в SQL Server 2008

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

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

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

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

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

exec(@sql) 

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

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

ответ

2

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

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

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

+0

хорошо, моя процедура будет принимать более 40 аргументов, которые по умолчанию равны нулю, а серия проверок значений будет действовать как переключаемая для создания предложения where. Спасибо, кстати, я полностью забыл о сфере (я новичок), и мне помогли 2 хэш-знака. Благодарю. – IWriteApps