2017-02-22 12 views
1

У меня есть база данных, которая реплицируется на двух серверах, реальном сервере и тестовом сервере, так что всякий раз, когда это необходимо, база данных «test» перезаписывается (так что я могу сбросить все, если я сделал беспорядок.) Я хочу хранимую процедуру в базе данных «test», которая будет работать только в базе данных «test», но для этого я нужно также иметь его в «живой» базе данных, чтобы его можно было скопировать, когда «тест» перезаписан. Процедура начинается:Создание хранимой процедуры, несмотря на ошибки (для передачи на другой сервер)

if @@SERVERNAME<>'TEST' 
begin 
    raiserror ('NOT ON TEST! This SP must only be run on TEST.',16,1) 
    return 
end 

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

К сожалению, сервер базы данных «Live» использует более старую версию SQL и, похоже, не понимает операторы lead/lag/over в сценарии и отказывается создавать процедуру из-за этих ошибок «неправильного синтаксиса» ,

SP определенно работает на тестовом сервере. Есть ли способ игнорировать сообщения об ошибках при создании хранимой процедуры?

Я нашел предыдущий вопрос, который объяснил, как сделать a хранимой процедурой с тем же именем, но мне нужна хранимая процедура, чтобы содержать скрипт, который, по мнению сервера, является неправильным.

+1

О какой БД вы спрашиваете, MySQL или SQL Server? –

+0

SQL Server (Microsoft SQL Server Management Studio) –

+0

Оберните запросы, которые не работают в строку, и [выполнить] (https://msdn.microsoft.com/en-us/library/ms188332.aspx) их как динамические SQL. – Shiffty

ответ

3

Единственный способ не получить хранимую процедуру, подтвержденную при ее создании, - это запустить запрос dynamic-sql внутри.

Пример:

CREATE PROCEDURE dbo.YourStoredProcedure AS 
BEGIN 

IF @@SERVERNAME<>'TEST' 
BEGIN 
    RAISERROR ('NOT ON TEST! This SP must only be run on TEST.',16,1) 
    RETURN 
END 

DECLARE @SQL NVARCHAR = N' 
SELECT rowOne 
, rowTwo 
, valueOne 
, LEAD(valueOne) OVER (PARTITION BY rowOne ORDER BY rowTwo DESC) AS preValue 
FROM dbo.YourTable 
' 

EXEC(@SQL) 

END 

Примечания:

  • В долгосрочной перспективе, попытаться найти лучшую стратегию, чем репликации БД для различных систем. Проверьте непрерывное развертывание
  • Обязательно проверьте объединенные динамические sql для потенциальных проблем (sql-инъекция). Check QUOTENAME()
Смежные вопросы