Как отбросить хранимые процедуры совместимым с SQL 2000 + SQL 2005 способом? - PullRequest
2 голосов
/ 30 июля 2010

У меня есть проект, который требует от меня разработки в SQL Server 2005, но я выполняю развертывание в блоке SQL Server 2000.

Для 99% кода SQL у меня нет проблем, кажется, что всебыть обратно совместимым.

Теперь я только собираюсь начать добавлять все хранимые процедуры (SP) в систему контроля версий, и мне нравится идея добавлять и удалять каждый раз, когда выполняется запрос.IE, если SP уже существует, сначала сбросьте его.Затем создайте / заново создайте SP.

Как мне сделать это в одном сценарии способом, совместимым как с SQL 2000, так и с SQL 2005, чтобы мои сценарии работали только во время разработки (2000).) И производство (2005)?Я считаю, что синтаксис немного отличается, и метаданные SP хранятся в разных системных таблицах.

Пожалуйста, помогите с рабочим сценарием SQL.

Ответы [ 8 ]

4 голосов
/ 09 августа 2010

Это работает как для SQL 2000, так и для SQL 2005. Я проверил это прямо сейчас.

USE databasename
GO

IF object_id('schema.StoredProcedureName') IS NOT NULL
DROP PROCEDURE schema.StoredProcedureName
GO

CREATE PROCEDURE schema.StoredProcedureName
.. your code
3 голосов
/ 02 августа 2010

Не используйте системные таблицы: используйте OBJECT_ID

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

У меня есть и история кода, и более простые развертывания: нет необходимости удалятьсоздать все процы.Что если вы забудете разрешение, например?

Я использую Red Gate / SVN BTW

2 голосов
/ 30 июля 2010

Я думаю,

 IF OBJECT_ID('your_sp_name') IS NOT NULL

скажет вам, если он там есть, хотя я не могу проверить 2000 на мо ...

1 голос
/ 02 августа 2010

Мне кажется, что вы воссоздаете все СОХРАНЕННЫЕ ПРОЦЕДУРЫ в отношении sys.sp_refreshsqlmodule, как если бы описано в моем старом ответе Я ищу надежный способ проверки хранимых процедур T-SQL.У кого-нибудь есть один? .Код СОХРАНЕННЫХ ПРОЦЕДУР будет еще раз проверен с учетом зависимостей.

1 голос
/ 30 июля 2010

Лучшим вариантом является отображение совместимости, sysobects, syscolumns и т. Д.

Проверьте следующую ссылку http://msdn.microsoft.com/en-us/library/ms187376.aspx

Многие системные таблицыболее ранние выпуски SQL Server теперь реализованы в виде набора представлений.Эти представления известны как представления совместимости, и они предназначены только для обратной совместимости.Представления совместимости предоставляют те же метаданные, которые были доступны в SQL Server 2000.

1 голос
/ 30 июля 2010

FWIW

select * from sysobjects where type = 'p'

все еще работает в SQL 2008, поэтому я предполагаю, что это все еще приемлемо в качестве наименьшего общего знаменателя.DMV не были доступны в 2000 году.

0 голосов
/ 05 августа 2010

В большинстве случаев я бы попытался запустить SQL2000 TSQL на коробке 2005 года, так как ожидал, что он будет в значительной степени обратно совместим. Тем не менее, вы должны завершить обновление своей производственной версии, чтобы использовать более новый TSQL.

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

Чтобы определить, какая версия SQL Server 2000/2005 работает, подключитесь к SQL Server 2000/2005 с помощью Query Analyzer, а затем запустите следующий код:

   SELECT 
      SERVERPROPERTY('productversion'), 
      SERVERPROPERTY ('productlevel'), 
      SERVERPROPERTY ('edition')

Результаты: Версия продукта (например, 8.00.534). Уровень продукта (например, «RTM» или «SP2»). Издание (например, «Стандартное издание»).

Например, результат выглядит примерно так: 8.00.534 RTM Standard Edition


Источник: http://blog.sqlauthority.com/2007/03/07/sql-server-script-to-determine-which-version-of-sql-server-2000-2005-is-running/


Как только вы определили версию, вы можете выполнить соответствующий уровень кода.

0 голосов
/ 04 августа 2010

Использование представления INFORMATION_SCHEMA.ROUTINES должно работать в SQL Server 2000, 2005 и 2008. Единственным недостатком является то, что представление больше не является жизнеспособным средством определения схемы объекта.

Но если это не проблема, попробуйте такой скрипт:

USE YourDB
GO

IF EXISTS (
  SELECT * 
  FROM INFORMATION_SCHEMA.ROUTINES 
  WHERE ROUTINE_NAME = 'usp_test'
) DROP PROCEDURE usp_test
GO

CREATE PROCEDURE usp_test AS
SELECT 1 AS val
GO

EXEC usp_test
GO
...