Динамический SQL, sp_executesql и перестройка динамического оператора SQL - Часть 2 - PullRequest
0 голосов
/ 06 февраля 2011

Часть 2: В своей статье «Условия динамического поиска в T-SQL ... для SQL 2005 и более ранних версий» Эрланд Соммарског приводит пример использования динамического sql с sp_executesql.

http://www.sommarskog.se/dyn-search-2005.html#sp_executesql

SELECT @sql =                                                  -- 19
'SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity,     -- 20
        c.CustomerID, c.CompanyName, c.Address, c.City,        -- 21
        c.Region,  c.PostalCode, c.Country, c.Phone,           -- 22
        p.ProductID, p.ProductName, p.UnitsInStock,            -- 23
        p.UnitsOnOrder                                         -- 24
 FROM   dbo.Orders o                                           -- 25
 JOIN   dbo.[Order Details] od ON o.OrderID = od.OrderID       -- 26
 JOIN   dbo.Customers c ON o.CustomerID = c.CustomerID         -- 27
 JOIN   dbo.Products p ON p.ProductID = od.ProductID           -- 28
     WHERE  1 = 1'                                             -- 29
                                                               -- 30
IF @orderid IS NOT NULL                                        -- 31
   SELECT @sql = @sql + ' AND o.OrderID = @xorderid' +         -- 32
                        ' AND od.OrderID = @xorderid'          -- 33
                                                               -- 34
IF @fromdate IS NOT NULL                                       -- 35
   SELECT @sql = @sql + ' AND o.OrderDate >= @xfromdate'       -- 36

и т.д ...

В другой статье на dyanmic sql он пишет:

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

Так что мой вопрос вращается вокруг этой проблемы: если вы ужеПостроил динамический SQL-оператор один раз, а оператор SELECT в @sql возвращает col1, col2, col3, col4 и т. д. Что делать, если вам придется повторно запросить тот же набор результатов разными способами?Например, если вам нужно было вернуть другой набор результатов с COUNT, сгруппированным по col1, и другой набор результатов с COUNT, сгруппированным по col2, или по каким-то другим критериям, основой которых является набор результатов из исходного @sql?

Придется ли вам пересоздавать @sql заново для каждого сценария, чтобы в итоге вы получили @sql, @ sql_2, @ sql_3, ...?

В этом случае, будет ли динамический sql по-прежнему лучшим вариантом или лучше использовать статический sql, который вставляется в таблицу #temp, так что вы можете повторно запросить результаты таблицы #temp?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2011

Другим способом сделать это, хотя и более ограниченным в использовании, чем ваша собственная находка, было бы использование устройства INSERT ... EXEC.

INSERT INTO sometable    /* or @vartable or #temptable */
EXEC sp_executesql @sql  /* and @params, if needed */

Вы не можете использовать это в SP, который сам вызывается в другом INSERT...EXEC.

0 голосов
/ 06 февраля 2011

Хорошо, вот пример решения этой проблемы с сайта msdn.

http://social.msdn.microsoft.com/Forums/en/sqlreportingservices/thread/3ed6885a-fe18-41c0-bce4-76c44c737a1b

Проблема заключается в следующем: если вы создаете временную таблицу и создаете временную таблицу ВНУТРИ динамического SQL, у вас нет шансов получить доступ к временной таблице ВНЕ динамического SQL. Однако, если вы сначала создадите временную таблицу ВНЕ динамического sql, затем заполните временную таблицу ВНУТРИ динамического SQL, вы можете получить доступ к заполненной временной таблице ВНЕ динамического SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...