|
|
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
Каким образом возможно вернуть в селекте результат хранимой процедуры Например: в качестве аргумента принимается значение поля таблицы, хранимая процедура (условно говоря) умножает его на два и необходимо получить в результирующем наборе вводимое поле и результат, обработанный процедурой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 11:05:37 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
Верни пустой селект(рекордсет) и отлови его ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 11:25:04 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
Это можно реализовать в виде INLINE - UDF (пользовательских функций) смотри BOL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 11:25:49 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
куда еще проще UDF??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 11:47:23 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
не думаю, что такой вариант будет работоспособен, тому есть несколько причин с моей точки зрения. Могу и ошибаться. 1. SP может возвращать неограниченное число рекордсетов. 2. SP может выводить какие либо данные через PRINT 3. план исполнения SP не всегда известен, т.к. в ней могут использоваться различные конструкции типа EXEC [sp_executesql]. ну и дальше... кстати, мне самому было бы интересно, что скажут гуру на эту тему, т.к. проблема, подбная указанной у меня уже появлялась ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 12:06:04 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
с UDF работает все нормально, просто и красиво ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 12:21:44 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
С помощью динамического SQL. Пример: declare @SQLString varchar(8000) declare @Param int set @Param=3 set @SQLString='select '+cast(@Param as varchar(10))+'*2' exec (@SQLString) Следует только учесть, что динамический SQL выполняется не с правами автора хранимой процедуры, в которой он задействуется, а с правами пользователя, запускающего данную процедуру. Поэтому если динамический SQL использует обращение к каким-либо таблицам или другим объектам БД, у пользователя должны быть соответсвующие права доступа к этим объектам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 12:28:38 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
2AVL UDF не панацея в том случае, когда есть необходимость использовать EXEC, т.к. в UDF это запрещено :( вот и приходится писать через курсоры и затем последовательно исполнять запросы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 12:38:48 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
2AAron согласен все зависит от постановки задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 12:57:01 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
Постановка задачи: в качестве аргумента принимается значение поля таблицы, хранимая процедура (условно говоря) умножает его на два и необходимо получить в результирующем наборе вводимое поле и результат, обработанный процедурой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 12:59:41 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
CREATE FUNCTION dbo.multi_pulti (@chislo int) RETURNS int AS BEGIN return @chislo*2 END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 13:04:20 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
select dbo.multi_pulti(int_field), int_field ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 13:05:36 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
это некрасиво ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 13:44:32 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
У меня SQL7.0 и там нету UDF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 13:56:32 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
2Новичок напиши, какой рекордсет ты хотел бы от хранимой процедуры получить? кстати, можно немного извратится и сделать подобным образом Код: plaintext 1. 2. тогда RS будет записан в таблицу TMP, но с этим надо очень осторожно работать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 14:26:44 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
Мне бы надо так: select tb1.field1, exec sp_1 tb1.field1 from table tb1 При этом sp_1 возвращает единственное значение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 14:36:15 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
используй OPENQUERY, если хочешь пренеприменно выполнить одним селектом. Синтаксис смотри в BOL. Правда способ тоже через одно место, нужно залинковать сам на себя сервер, но краше вариант для SQL7 - временные таблы, для 2000- UDF. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 14:45:34 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
а может имеет смысл вместо ХП использовать подзапрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 15:17:39 |
|
||
|
SELECT TAB1.*,SP.*
|
|||
|---|---|---|---|
|
#18+
Там внутри куча всего, локальные переменные, навороченные sql- конструции, короче ;jgf ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2002, 15:25:12 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=46&tid=1821336]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 291ms |

| 0 / 0 |
