Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 помогите создать функцию  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
Всем привет. Как вставить этот код в тело функции?
Здесь присутсвуют временные таблицы, на которые выходит ошибка.
Cannot access temporary tables from within a function

--DROP TABLE ##mntab
--DROP TABLE ##ACC_LINK
	
select n_id, in ##mntab  from HOSP h where n_id=@n_id

CREATE TABLE ##ACC_LINK (n_id varchar(1000), in varchar(200))

DECLARE @iCorr int
DECLARE @cAcc varchar(20)
DECLARE @cACC_LIST varchar(1000)
DECLARE c_LIST_CORR CURSOR FOR

SELECT n_id FROM ##mntab GROUP BY n_id

OPEN c_LIST_CORR
FETCH NEXT FROM c_LIST_CORR INTO @iCorr

WHILE @@FETCH_STATUS = 0
BEGIN
SET @cACC_LIST = ''
DECLARE c_LIST_ACC CURSOR FOR
SELECT in FROM ##mntab WHERE n_id = @iCorr
OPEN c_LIST_ACC
FETCH NEXT FROM c_LIST_ACC INTO @cAcc

WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @cACC_LIST = @cACC_LIST + @cAcc
FETCH NEXT FROM c_LIST_ACC INTO @cAcc
IF @@FETCH_STATUS = 0
SELECT @cACC_LIST = @cACC_LIST + ', '
END
CLOSE c_LIST_ACC
DEALLOCATE c_LIST_ACC
INSERT ##ACC_LINK
SELECT @iCorr AS CORR
, @cACC_LIST AS CACC_LIST
FETCH NEXT FROM c_LIST_CORR INTO @iCorr
END
CLOSE c_LIST_CORR
DEALLOCATE c_LIST_CORR
end
14 сен 12, 11:39    [13163244]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
НадеждаМ,

что делает весь этот ужас?
14 сен 12, 11:40    [13163253]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
НадеждаМ,

use Table Variables, Luke!
14 сен 12, 11:42    [13163282]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
iap
НадеждаМ,

что делает весь этот ужас?

Конкетенирует список счетов в строку используя какие-то забавные правила
14 сен 12, 11:44    [13163300]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
locky, Да конкатенирует список в строку
14 сен 12, 11:47    [13163334]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
Если можно этот код как-то упростить, то буду рада предложениям.
14 сен 12, 11:48    [13163341]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
НадеждаМ,

что делает весь этот ужас?
Кажется, что-то перечисляется в строке через запятую? Да?
Какая версия сервера? (PRINT @@VERSION)
Скрипт CREATE TABLE HOSP(....) выложите тут для ясности.
14 сен 12, 11:49    [13163354]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Замечу, всё же, что есть аж два FAQа на эту тему...
14 сен 12, 11:52    [13163399]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
iap, Да вы правы

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )


hosp

n_id in
2119051 38.00
2119051 758.00


надо в результате всех этих действий получить:

2119051 38.00 , 758.00
14 сен 12, 11:54    [13163419]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
n_id in
2119051 38.00
2119051 758.00



надо в результате всех этих действий получить:

2119051 38.00 758.00
14 сен 12, 11:55    [13163428]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
Блин, извините

n_id in
2119051 38.00
2119051 758.00




надо в результате всех этих действий получить:

n_id in
2119051 38.00; 758.00
14 сен 12, 11:58    [13163466]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Так?
SELECT CAST(H.n_id AS VARCHAR)+' '+STUFF((SELECT ','+HH.[in] FROM hosp HH WHERE HH.n_id=H.n_id FOR XML PATH('')),1,1,'')
FROM hosp T
GROUP BY H.n_id
ORDER BY H.n_id;
14 сен 12, 12:00    [13163485]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Или так?
SELECT CAST(H.n_id AS VARCHAR)+' '+STUFF((SELECT '; '+HH.[in] FROM hosp HH WHERE HH.n_id=H.n_id FOR XML PATH('')),1,2,'')
FROM hosp T
GROUP BY H.n_id
ORDER BY H.n_id;
14 сен 12, 12:03    [13163520]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Наконец, вот так (ну тупой я, не понимаю, в каком виде надо!):
SELECT H.n_id,[in]=STUFF((SELECT '; '+HH.[in] FROM hosp HH WHERE HH.n_id=H.n_id FOR XML PATH('')),1,2,'')
FROM hosp T
GROUP BY H.n_id
ORDER BY H.n_id;
14 сен 12, 12:05    [13163539]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Например:
CREATE FUNCTION dbo.F(@n_id INT=NULL) RETURNS TABLE
RETURN
SELECT H.n_id,[in]=STUFF((SELECT '; '+HH.[in] FROM hosp HH WHERE HH.n_id=H.n_id FOR XML PATH('')),1,2,'')
FROM hosp T
WHERE @n_id IS NULL OR H.n_id=@n_id
GROUP BY H.n_id;
Кстати, [in] - не вполне удачное имя, так как совпадает с ключевым словом
14 сен 12, 12:53    [13164045]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
iap,

В принципе и так тоже подойдет. Спасибо
14 сен 12, 13:14    [13164287]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
НадеждаМ
iap,

В принципе и так тоже подойдет. Спасибо
Ну, извините.
Я думал, что курсоры и табличные переменные Вы и сами добавите по вкусу.
Вы ими мастерски владеете.
14 сен 12, 13:19    [13164352]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
iap,

Ну я не волшебник, я только учусь.... Сейчас поэксперементирую посмотрим что выйдет.
14 сен 12, 13:27    [13164449]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
Лори
Member

Откуда:
Сообщений: 1256
НадеждаМ, вот dll-шка пользовательской агрегатной функции "Конкатенация".
Можно подключить как программно, так и вручную:
--Разрешаем выполнение:
sp_configure 'show advanced options', 1; RECONFIGURE;
GO
sp_configure 'clr enabled', 1; RECONFIGURE;

--Создание:
CREATE ASSEMBLY SqlClassLibrary FROM 'C:\...Путь...\SqlClassLibrary.dll'
CREATE AGGREGATE [Конкатенация] (@VALUE NVARCHAR(4000)) RETURNS NVARCHAR(4000) EXTERNAL NAME [SqlClassLibrary].[Koncatenaciya.Koncatenacija]

--Ну и использование:
SELECT  ..., dbo.Конкатенация(Возраст)
FROM Tabla
GROUP BY ...


К сообщению приложен файл (SqlClassLibrary.dll - 7Kb) cкачать
14 сен 12, 18:38    [13167081]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Лори
вот dll-шка пользовательской агрегатной функции "Конкатенация".
Зачем?

Тем более что брать нативный код (DLL, EXE), взятый не пойми где, моветон.
14 сен 12, 18:50    [13167119]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
Лори
Member

Откуда:
Сообщений: 1256
Mnior
Лори
вот dll-шка пользовательской агрегатной функции "Конкатенация".
Зачем?

Тем более что брать нативный код (DLL, EXE), взятый не пойми где, моветон.

Если в чем-то сомневаетесь, всегда это "что-то" можно проверить на тестовом сервере.
Плюсы пользовательских функций в универсальности, или вы предпочитаете дублировать код, каждый раз изменяя в нем названия таблиц и полей?
14 сен 12, 18:56    [13167138]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Лори,

Попробуйте сконкатенировать вашей замечательной функцией строки в определенном порядке.
14 сен 12, 19:44    [13167317]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
step_ks
Member

Откуда:
Сообщений: 936
Лори
Mnior
пропущено...
Зачем?

Тем более что брать нативный код (DLL, EXE), взятый не пойми где, моветон.Если в чем-то сомневаетесь, всегда это "что-то" можно проверить на тестовом сервере.

А может, он по праздникам не работает.

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

От универсальности уже давно не ждется ничего хорошего. А CLR на 32 битном сервере иногда вообще сложно заставить начать нормально работать без собственного участия (ключ -g, и то не всегда помогает)
14 сен 12, 20:56    [13167500]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Лори
Если в чем-то сомневаетесь, всегда это "что-то" можно проверить на тестовом сервере.
Взаимоисключающие параграфы.
Если кто-то имеет тестовые стенд и умеет проверить чужой код на 100500 факторов, то ему точно явно не имеет смысла брать чужую поделку. Даже думать нет смысла, тем более ради такой фигню. При том гарантий дать нельзя, даже если ты кул хацкер и сделал полный реверс-инжиниринг.
Идея идиотическая на фсе 186%.

Смысл есть только если приводится исходный код.
Но в BOL примерах он уже есть.

Лори
Плюсы пользовательских функций в универсальности, или вы предпочитаете дублировать код, каждый раз изменяя в нем названия таблиц и полей?
В данном случа дублировать есть меньшее из зол, считайте что там название функции большое.
Лучше подождать (неважно сколько) когда M$ реализует нормальную функцию.

Из всего что я применял на практике менее 5% случаев когда нужно было делать группировку (частенько одноразовые запросы), в основном надо было собирать в переменную (динамика, для администрирования самой системы).

Группировка - это когда необходим подзапрос, в остальном аргумент с "подстановкой названия таблиц и колонок" вообще левый.
14 сен 12, 22:18    [13167808]     Ответить | Цитировать Сообщить модератору
 Re: помогите создать функцию  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
На тестовых стендах обычно проверяют из доверенных источников.
14 сен 12, 22:20    [13167820]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить