2014-10-01 2 views
0

Я хотел бы повторно использовать код, не создавая новый элемент под узлом Programmability в SQL Server Management Studio.Процедура или функция Transact SQL, которая существует в пределах области действия программы

В сущности, мне нужно разделить поле с точками шкалы с запятой с запятой и средними значениями. Поэтому, если у меня есть поле, которое выглядит как '6;10;7;8;9'. Мне нужно разделить это поле на 5 отдельных баллов и усреднить их.

Для этого мне сначала нужно получить положение каждой точки с запятой.

Delimiter1 = CHARINDEX (';' , replace( replace(ifm.MEAS_VALUE, 'Worst Pain', 
    '10'), 'No Pain', 0)) 
Delimiter2 = CHARINDEX (';' , replace( replace(ifm.MEAS_VALUE, 'Worst Pain', 
    '10'), 'No Pain', 0), CHARINDEX (';' , replace( replace(ifm.MEAS_VALUE, 
    'Worst Pain', '10'), 'No Pain', 0)) + 1) 

Таким образом, вместо

Delimiter2 = CHARINDEX (';' , replace( replace(ifm.MEAS_VALUE, 'Worst Pain', 
    '10'), 'No Pain', 0), CHARINDEX (';' , replace( replace(ifm.MEAS_VALUE, 
    'Worst Pain', '10'), 'No Pain', 0)) + 1) 

я мог бы использовать

Delimiter2 = CHARINDEX (';' , replace( replace(ifm.MEAS_VALUE, 'Worst Pain', 
    '10'), 'No Pain', 0), Delimiter1 + 1) 

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

Единственное, что я не хочу, чтобы процедура или функция сохранялись после завершения кода. Есть ли пример того, что кто-то повторно использует код в модульном режиме в рамках кода, не оставляя за собой совершенно новую процедуру или функцию?

Заранее спасибо.

+0

Вы можете попробовать сделать Delimiter1 CTE (Common Table Expression). –

ответ

1

Вы можете создать временную хранимую процедуру.

SET NOCOUNT ON 
GO 

CREATE PROC#temporaryStoredProcedure 
AS 
BEGIN 

    Do Work Here 

END 
GO 

DROP PROC#temporaryStoredProcedure 
GO 

Конечно, вы не получили бы выгоду от кэшированных планов выполнения, но было бы убедиться, что вы ничего не оставить в SQL Server.

0

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

declare @S varchar(20) = '6;10;7;8;9' 

select cast(replace(@S, ';', '<X/>') as xml).value('avg(text())', 'decimal(10, 2)') 

Результат:

8.00 

Заменить все ; с пустым тегом <X/>, отлитый в XML и извлечь среднее значение из текстовых значений в XML, который выглядит следующим образом.

6<X />10<X />7<X />8<X />9 
+0

Отличная обратная связь! Всем спасибо :) – jch

 Смежные вопросы

  • Нет связанных вопросов^_^