T-SQL отримує SELECTED значення збереженої процедури


95

У T-SQL це дозволено:

DECLARE @SelectedValue int
SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Отже, можна отримати значення SELECT та вкласти його у змінну (за умови, що це скалярно, очевидно).

Якщо я поміщу ту саму логіку вибору в збережену процедуру:

CREATE PROCEDURE GetMyInt
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Чи можу я отримати висновок цієї збереженої процедури та вкласти її у змінну?

Щось на зразок:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(Я знаю, що наведений вище синтаксис заборонений, оскільки я його спробував!)

Відповіді:


191

Є три способи, якими можна скористатися: значення RETURN та параметр OUTPUT та набір результатів

ТАКОЖ, будьте обережні, якщо ви використовуєте шаблон: SELECT @Variable=column FROM table ...

якщо із запиту повернуто кілька рядків, ваш @Variable міститиме лише значення з останнього рядка, що повертається запитом.

ПОВЕРНІТИ ЗНАЧЕННЯ,
оскільки ваш запит повертає поле int, принаймні на основі того, як ви його назвали. Ви можете скористатися цим трюком:

CREATE PROCEDURE GetMyInt
( @Param int)
AS
DECLARE @ReturnValue int

SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN @ReturnValue
GO

а тепер викличте свою процедуру, як:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC @SelectedValue = GetMyInt @Param
PRINT @SelectedValue

це буде працювати лише для INT, оскільки RETURN може повернути лише одне значення int, і нулі перетворюються на нуль.

ВИХІДНИЙ ПАРАМЕТР
ви можете використовувати вихідний параметр:

CREATE PROCEDURE GetMyInt
( @Param     int
 ,@OutValue  int OUTPUT)
AS
SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

а тепер викличте свою процедуру, як:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC GetMyInt @Param, @SelectedValue OUTPUT
PRINT @SelectedValue 

Вихідні параметри можуть повертати лише одне значення, але можуть бути будь-якого типу даних

RESULT SET для набору результатів зробіть процедуру, як:

CREATE PROCEDURE GetMyInt
( @Param     int)
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

використовувати його як:

DECLARE @ResultSet table (SelectedValue int)
DECLARE @Param int
SET @Param=1
INSERT INTO @ResultSet (SelectedValue)
    EXEC GetMyInt @Param
SELECT * FROM @ResultSet 

набори результатів можуть мати багато рядків і багато стовпців будь-якого типу даних


5
Зверніть увагу, що підхід до набору результатів вимагає використання цієї таблиці / вставки, навіть якщо повертається лише один запис. Я шукав ярлик безпосередньо для змінної, але його немає.
goodeye

чи можна використовувати підхід "повернене значення" та "вихідний параметр" у результаті кількох рядків?
ji-ruh

@ ji-ruh, збережена процедура може використовувати один, жоден, деякі або всі: набір результатів, повернені вихідні параметри та / або значення, що повертається
KM.

4

Існує також комбінація, ви можете використовувати повернене значення з набором записів:

- Зберігається процедура -

CREATE PROCEDURE [TestProc]

AS
BEGIN

    DECLARE @Temp TABLE
    (
        [Name] VARCHAR(50)
    )

    INSERT INTO @Temp VALUES ('Mark') 
    INSERT INTO @Temp VALUES ('John') 
    INSERT INTO @Temp VALUES ('Jane') 
    INSERT INTO @Temp VALUES ('Mary') 

    -- Get recordset
    SELECT * FROM @Temp

    DECLARE @ReturnValue INT
    SELECT @ReturnValue = COUNT([Name]) FROM @Temp

    -- Return count
    RETURN @ReturnValue

END

- Телефонний код--

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Результати--

введіть тут опис зображення


Як отримати ці результати в php?
HagaHood

3

Вам потрібно буде використовувати повернені значення.

DECLARE @SelectedValue int

CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT)
AS
SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Тоді ви називаєте це так:

EXEC GetMyInt OUTPUT @SelectedValue

2

Спробуйте зробити це:

EXEC @SelectedValue = GetMyInt

7
Це неправильно. Оператор SELECT не стає повернутим значенням SPROC, якщо не вказано всередині SPROC.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.