Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
Есть строка динамического запроса - @StrSQL, возвращающий единственное значение.

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

Что-то типа Set @SSS = exec(@StrSQL).

Может Что в строке запроса Дописать?
14 апр 03, 09:29    [173039]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Вот тут глянь

https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=25413
14 апр 03, 09:32    [173042]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
СПАСИБО!
14 апр 03, 10:58    [173150]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
????А Что, Exec sp_executesql Нельзя вызвать из функции ??? :(
14 апр 03, 12:51    [173330]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
Есть проблемка...
Хотелось бы результат ентого самого динамического запроса возвращать из функции, на что скул ругается.
Можно ли обойти этот косяк?
14 апр 03, 13:31    [173406]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
В функции можно вызывать тока extended хп. Я так понимаю, ты хочешь поиметь скалярную функцию, в которую передаешь SQL в качестве параметра. А потом ее в запросе юзать. А без динамического SQL никак нельзя.
14 апр 03, 13:37    [173415]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
опиши более подробно свою проблему.... может и без динамика обойдешся...
14 апр 03, 14:16    [173474]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
Проблема :

Нужно по Коду типа реквизита найти наименование колонки в справочной таблице (без проблем) и сформировать Запрос на поиск значения по этой колонке в другой таблице, в результате получить искомое значение.

Для чего:

Справочник реквизитов документов:

RecID RecName RecFormat RecColName
1 Клиент uniqueidentifier CN00000001
2 Банк uniqueidentifier CN00000002
3 Магазин uniqueidentifier CN00000003
........ и тд.

Справочник типовых проводок:

ItemTypeID PyersRecID RecipientRecID
1 1 3
2 3 2

Справочник документов:
DocID CN00000001 CN0000003 .... CN00000999
Уже заполнен данными

Для заполнения типовой проводки 1 по документу необходимо выдрать значения из Колонок CN00000001 и CN00000003 ну и так далее.
14 апр 03, 15:24    [173593]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Нужно по Коду типа реквизита найти наименование колонки в справочной таблице (без проблем) и сформировать Запрос на поиск значения по этой колонке в другой таблице, в результате получить искомое значение.

Схема данных откуда такая. Сами делали, или это 1с.
14 апр 03, 15:30    [173600]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
Glory
Member

Откуда:
Сообщений: 104760
С такой схемой данных невозможно обойтись без динамического запроса.
Если нельзя изменить структуру таблицы "Справочник документов", то как выход можно построить на ее основе представление
CREATE VIEW myview AS

SELECT DocID, 'CN00000001' AS CN, CN00000001 AS CN_VALUE FROM [Справочник документов]
UNION ALL
SELECT DocID, 'CN00000002' AS CN, CN00000002 AS CN_VALUE FROM [Справочник документов]
....
SELECT DocID, 'CN00000999' AS CN, CN00000999 AS CN_VALUE FROM [Справочник документов]


Правда с производительностью могут быть проблемы
14 апр 03, 15:40    [173611]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
Схема данных откуда такая. Сами делали, или это 1с.

Схему писал сам. от 1С там только структура хранения документов и то не целиком. Единая таблица содержит значение реквизитов для целого пакета типовых документов. Все документы - виртуальные. При необходимости можно сгенерить любой. Движение средств по документу описано проводкой типа.

PaketID DokTypeID PyerID RecipientID ItemTypeID ItemSumma OperID
unique int unique unique int money unique

Плательщик и Получатель определены uniqueidentifier, по которому из справочников, по необходимости, извлекаются все возможные реквизиты.

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

Красивее всего должно было получиться с помощью функции.

2 Glory

Форматы данных в колонках - различные. При обработке могут возникать проблемы с конвертацией. Количество реквизитов пакета документов не постоянно. Так что с представлением еще больший геморой заработать можно...
15 апр 03, 07:12    [174072]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Схему писал сам. от 1С там только структура хранения документов и то не целиком.

Охо-хонюшки хо-хо. Ну разве ж можно брать 1с как образец создания структуры хранения данных. Вот и имеешь теперь геморой со всякой динамикой и т.п. Если не поздно, надо переделывать структуру. IMHO.
15 апр 03, 08:22    [174101]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
Не все так грустно.

Схема не так плоха как хотелось бы.

Исходя из перспективы изменения состава пакетов документов, решения лучше у меня пока нет.

Имея плоскую структуру - получил бы лишнюю избыточность и объёмы при репликации.
15 апр 03, 08:37    [174111]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31596
Я думаю, что для этой схемы данных оптимально будет делать не процедуру, возвращающую рекордсет по типовой проводке, а процедуру, генерящую другие процедуры по справочнику типовых проводок, т.к.:
1. первый вариант возможен только с динамическими запросами из процедур или запросами из клиента. При этом проявятся недостатки этого подхода - время на компиляцию и раздача прав пользователям на таблицы.
2. справочник типовых проводок меняется редко, соответственно второй вариант не так плох. Можно сделать ХП с динамическими запросами, которая будет генерить все процедуры по по справочнику типовых проводок.
15 апр 03, 10:09    [174232]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
Glory
Member

Откуда:
Сообщений: 104760
2trsnv5

Дело конечно ваше - менять структуру или нет.
А если у вас sql2000, то там есть прекрасный тип данных sql_variant.

use northwind

go
select cast(orderid as sql_variant) as orderid from orders
union all
select cast(customerid as sql_variant) as customerid from orders
union all
select cast(orderdate as sql_variant) as orderdate from orders
go


Имея плоскую структуру - получил бы лишнюю избыточность и объёмы при репликации.

Лишнюю избыточность и объемы ???
15 апр 03, 10:18    [174252]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
2 Glory
Структура документооборота - лишь4я часть всего :(,
а при обработке до 2000 пакетов в сутки получается довольно много всего.
Вот и приходится кроить...
15 апр 03, 11:14    [174384]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Структура документооборота - лишь4я часть всего :(,
а при обработке до 2000 пакетов в сутки получается довольно много всего.


Структура (нормальная) хранения информации это основа всего и вся. Если она сделана без учета реляционной модели, то геморой в последующем обеспечен. Причем, чем больше объемы обрабатываемой информации в нерялционной структуре, тем выше скорость образования тормозов. Плюс куча проблем с безопасностью при использовании динамических запросов.
15 апр 03, 11:20    [174395]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
Структура (нормальная) хранения информации это основа всего и вся. Если она сделана без учета реляционной модели, то геморой в последующем обеспечен

Т.к. главное в системе не обработка не документов, а движение средств, то приходится чем то жертвовать. Мне не трудно поменять структуру (благо еще не поздно), но я за 3 месяца уже кучу вариантов перебрал... Отсановился, пока, на этом. Пытаюсь отработать...
15 апр 03, 11:33    [174430]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
>Т.к. главное в системе не обработка не документов, а движение средств

Чет я не понял, про какие ты средства говоришь. Все средства могут двигаться тока на основании первичных документов. Будет геморой с документами, будет геморой и с движением.
15 апр 03, 11:35    [174434]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть данные в переменную с помощью exec или sp_executesql.  [new]
trsnv5
Member

Откуда: Новосибирск
Сообщений: 107
Все средства могут двигаться тока на основании первичных документов

Я не собираюсь асучить бухгалтерию.

Мне достаточно знать Код пакета документов и код типового документа в пакете. Остальное - и 1С разгребет.
15 апр 03, 11:43    [174453]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить