Можно ли сделать выбор на результатах хранимой процедуры в T-SQL

Вы можете использовать concatMap:

import { of } from 'rxjs';
import { concatMap } from 'rxjs/operators';

of([65, 66, 67, 68]).pipe(concatMap(x => x)).subscribe(console.log);
5
задан Michael Fredrickson 15 February 2012 в 23:01
поделиться

5 ответов

Это возможно, но конечно не правильный способ пойти:

USE test
GO
CREATE procedure dbo.select1 AS
SELECT 1 
GO
EXEC sp_addlinkedserver @server='OQtest', @datasrc='localhost', @provider='SQLNCLI', @srvproduct=''
GO
SELECT * FROM OPENQUERY(OQtest, 'test.dbo.select1')

Вы, возможно, также должны скорректировать настройки безопасности на сервере для этого для работы.

2
ответ дан 18 December 2019 в 13:19
поделиться

Вы не можете сделать этого, однако можно сделать это как вставку. например.

insert mytable
exec myStoredProcedure

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

9
ответ дан 18 December 2019 в 13:19
поделиться

Что, если сохраненный proc не возвращает строк? Несколько наборов результатов? Изменения? Потенциальные использования сохраненного proc - многие и варьировались.

Когда Вы имеете SELECT * FROM TableOrView, существует прямая привязка и легко проверенный синтаксис и структура.

Более правильно, в реляционном смысле, сохраненный proc не является отношением/таблицей, таким образом, Вы не можете выбрать из него.

Определяемые пользователем функции достигают того, что Вы хотите, но позволяете коду соответствовать некоторому понятию отношения/таблицы.

1
ответ дан 18 December 2019 в 13:19
поделиться

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

Create Function [dbo].[CsvToInt] ( @Array varchar(1000)) 
returns @IntTable table 
    (IntValue int)
AS
begin

    declare @separator char(1)
    set @separator = ','

    declare @separator_position int 
    declare @array_value varchar(1000) 

    set @array = @array + ','

    while patindex('%,%' , @array) <> 0 
    begin

      select @separator_position =  patindex('%,%' , @array)
      select @array_value = left(@array, @separator_position - 1)

        Insert @IntTable
        Values (Cast(@array_value as int))

      select @array = stuff(@array, 1, @separator_position, '')
    end

    return
end

И затем простой выбор из функции...

Select * FROM dbo.CsvToInt('1,2,3,5')

И Вы получите значение таблицы.

1
ответ дан 18 December 2019 в 13:19
поделиться

Вы можете использовать подход, описанный ck, но это не очень рекомендуется. Вы можете проверить секцию INSERT-EXEC большого поста Как обмениваться данными между хранимыми процедурами от Эрланда Соммарского для более подробной информации.

1
ответ дан 18 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: