Временная функция или хранимая процедура в T-SQL - PullRequest
34 голосов
/ 10 апреля 2009

Есть ли шанс создать временную хранимую процедуру или функцию в MS SQL 2005? Я хотел бы использовать эту хранимую процедуру только в своем запросе, поэтому после выполнения она исчезнет.

У меня есть запрос, который я хотел бы EXEC для некоторых данных. Но для каждой таблицы я буду обрабатывать эту команду, мне нужно изменить некоторые ее части. Поэтому я подумал, что создам временный SP, который будет возвращать мне запрос из предоставленных мной аргументов (например, имя таблицы и т. Д.), А затем выполнять этот запрос с помощью EXEC.

И эта хранимая процедура для меня позже будет бесполезна, поэтому я бы хотел, чтобы она была временной, чтобы по окончании выполнения моего запроса она исчезла.

Ответы [ 3 ]

27 голосов
/ 10 апреля 2009

Повторное редактирование - похоже, вы должны использовать sp_ExecuteSQL против (параметризованного) nvarchar, содержащего TSQL.

Поиск по sp_ExecuteSQL; простой пример:

DECLARE @SQL nvarchar(4000),
 @Table varchar(20) = 'ORDERS',
 @IDColumn varchar(20) = 'OrderID',
 @ID int = 10248

 SET @SQL = 'SELECT * FROM [' + @Table + '] WHERE ['
  + @IDColumn + '] = @Key'

  EXEC sp_executesql @SQL, N'@Key int', @ID

Обратите внимание, что имена таблиц и столбцов должны быть объединены в запросе, но значения (например, @Key) могут быть параметризованы.


Существует временная хранимая процедура, но она предназначена для каждого соединения, а не для sp.

Однако вы можете захотеть взглянуть на общие табличные выражения - они могут быть тем, что вы ищете (хотя вы можете читать из них только один раз).

Может быть, если вы сможете уточнить, что вы пытаетесь сделать ?

27 голосов
/ 11 февраля 2014

Этот вопрос немного устарел, но другие ответы не смогли предоставить синтаксис для создания временных процедур. Синтаксис такой же, как и для временных таблиц: #name для локальных временных объектов, ## name для глобальных временных объектов.

CREATE PROCEDURE #uspMyTempProcedure AS
BEGIN
  print 'This is a temporary procedure'
END

Это описано в разделе «Название процедуры» официальной документации. http://technet.microsoft.com/en-us/library/ms187926%28v=sql.90%29.aspx

Я использую эту технику для дедупликации кода для моих примитивных модульных тестов T-SQL. Реальная структура модульного тестирования была бы лучше, но это лучше, чем ничего, и «мусор собирает» после себя.

0 голосов
/ 10 апреля 2009

Просто используйте SQL хранимого процесса внутри вашего запроса. Не нужно создавать хранимую процедуру внутри БД, она не даст вам никакого преимущества перед обычным запросом внутри вашего запроса.

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