matlab SQL Server存储过程返回表

tcbh2hod  于 2022-12-19  发布在  Matlab
关注(0)|答案(9)|浏览(332)

我有一个接受两个参数的存储过程。我可以在Server Management Studio中成功地执行它。它显示了我所期望的结果。但是它也返回了一个返回值。
它增加了这一行,

SELECT 'Return Value' = @return_value

我希望存储过程返回它在结果中显示的表,而不是返回值,因为我从MATLAB调用此存储过程,它返回的所有值都是true或false。
我需要在我的存储过程中指定它应该返回什么吗?如果需要,我如何指定一个4列的表(varchar(10),float,float,float)?

krcsximq

krcsximq1#

一个过程不能返回这样的表。但是你可以从一个过程中的表中选择一个,并将它定向到一个表(或表变量)中,如下所示:

create procedure p_x
as
begin
declare @t table(col1 varchar(10), col2 float, col3 float, col4 float)
insert @t values('a', 1,1,1)
insert @t values('b', 2,2,2)

select * from @t
end
go

declare @t table(col1 varchar(10), col2 float, col3 float, col4 float)
insert @t
exec p_x

select * from @t
cx6n0qe3

cx6n0qe32#

我经常使用表类型来确保一致性和简化代码。从技术上讲,你不能返回“一个表”,但是你可以返回一个结果集,使用INSERT INTO .. EXEC ...语法,你可以清楚地调用一个PROC并将结果存储到一个表类型中。在下面的例子中,我实际上是将一个表和另一个参数沿着传递到一个PROC中。那么我实际上是在“返回一个表”,然后可以将其作为表变量使用。

/****** Check if my table type and/or proc exists and drop them ******/
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'returnTableTypeData')
DROP PROCEDURE returnTableTypeData
GO
IF EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = 'myTableType')
DROP TYPE myTableType
GO

/****** Create the type that I'll pass into the proc and return from it ******/
CREATE TYPE [dbo].[myTableType] AS TABLE(
    [someInt] [int] NULL,
    [somenVarChar] [nvarchar](100) NULL
)
GO

CREATE PROC returnTableTypeData
    @someInputInt INT,
    @myInputTable myTableType READONLY --Must be readonly because
AS
BEGIN

    --Return the subset of data consistent with the type
    SELECT
        *
    FROM
        @myInputTable
    WHERE
        someInt < @someInputInt

END
GO

DECLARE @myInputTableOrig myTableType
DECLARE @myUpdatedTable myTableType

INSERT INTO @myInputTableOrig ( someInt,somenVarChar )
VALUES ( 0, N'Value 0' ), ( 1, N'Value 1' ), ( 2, N'Value 2' )

INSERT INTO @myUpdatedTable EXEC returnTableTypeData @someInputInt=1, @myInputTable=@myInputTableOrig

SELECT * FROM @myUpdatedTable

DROP PROCEDURE returnTableTypeData
GO
DROP TYPE myTableType
GO
7y4bm7vi

7y4bm7vi3#

考虑创建一个可以返回表并在查询中使用的函数。
https://msdn.microsoft.com/en-us/library/ms186755.aspx
函数和过程的主要区别在于函数不改变任何表,它只返回一个值。
在本例中,我创建了一个查询,以给予给定表中所有非空列的计数。
可能有很多方法可以解决这个问题,但它很好地说明了一个函数。

USE Northwind

CREATE FUNCTION usp_listFields(@schema VARCHAR(50), @table VARCHAR(50))
RETURNS @query TABLE (
    FieldName VARCHAR(255)
    )
BEGIN
    INSERT @query
    SELECT
        'SELECT ''' + @table+'~'+RTRIM(COLUMN_NAME)+'~''+CONVERT(VARCHAR, COUNT(*)) '+
    'FROM '+@schema+'.'+@table+' '+
          ' WHERE isnull("'+RTRIM(COLUMN_NAME)+'",'''')<>'''' UNION'
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table and TABLE_SCHEMA = @schema
    RETURN
END

然后使用执行函数

SELECT * FROM usp_listFields('Employees')

生成许多行,如:

SELECT 'Employees~EmployeeID~'+CONVERT(VARCHAR, COUNT(*)) FROM dbo.Employees  WHERE isnull("EmployeeID",'')<>'' UNION
SELECT 'Employees~LastName~'+CONVERT(VARCHAR, COUNT(*)) FROM dbo.Employees  WHERE isnull("LastName",'')<>'' UNION
SELECT 'Employees~FirstName~'+CONVERT(VARCHAR, COUNT(*)) FROM dbo.Employees  WHERE isnull("FirstName",'')<>'' UNION
a5g8bdjr

a5g8bdjr4#

如果既需要结果集又需要返回值,则可以使用out参数代替返回值

CREATE PROCEDURE proc_name 
@param int out
AS
BEGIN
    SET @param = value
SELECT ... FROM [Table] WHERE Condition
END
GO
91zkwejq

91zkwejq5#

我遇到过类似的情况,通过在过程中使用临时表解决了这个问题,原始存储过程返回了相同的字段:

CREATE PROCEDURE mynewstoredprocedure
AS 
BEGIN

INSERT INTO temptable (field1, field2)
EXEC mystoredprocedure @param1, @param2

select field1, field2 from temptable

-- (mystoredprocedure returns field1, field2)

END
nc1teljy

nc1teljy6#

存储过程返回的状态值只能是INT数据类型。不能在RETURN语句中返回其他数据类型。
Lesson 2: Designing Stored Procedures开始:
每个存储过程都可以返回一个整数值,称为执行状态值或返回代码。
如果您仍然希望从SP返回一个表,那么您必须在SP内处理SELECT返回的记录集,或者绑定到一个传递XML数据类型的OUTPUT变量。
嘿,
约翰

1rhkuytd

1rhkuytd7#

虽然这个问题已经很老了,但作为一个软件开发的新手,我不能停止自己分享我所学到的:

创建存储过程:

CREATE PROC usp_ValidateUSer
(
    @UserName nVARCHAR(50),
    @Password nVARCHAR(50)
)
AS
BEGIN
    IF EXISTS(SELECT '#' FROM Users WHERE Username=@UserName AND Password=@Password)
    BEGIN
        SELECT u.UserId, u.Username, r.UserRole
        FROM Users u
        INNER JOIN UserRoles r
        ON u.UserRoleId=r.UserRoleId
    END
END

执行存储过程:

(If您要测试SQL中存储过程的执行情况)

EXEC usp_ValidateUSer @UserName='admin', @Password='admin'

输出:

hvvq6cgz

hvvq6cgz8#

create procedure PSaleCForms
as
begin
declare 
@b varchar(9),
@c nvarchar(500),
@q nvarchar(max)
declare @T table(FY nvarchar(9),Qtr int,title nvarchar    (max),invoicenumber     nvarchar(max),invoicedate datetime,sp decimal    18,2),grandtotal decimal(18,2))
declare @data cursor
set @data= Cursor
forward_only static
for 
select x.DBTitle,y.CurrentFinancialYear from [Accounts     Manager].dbo.DBManager x inner join [Accounts Manager].dbo.Accounts y on        y.DBID=x.DBID where x.cfy=1
open @data
fetch next from @data
into @c,@b
while @@FETCH_STATUS=0
begin
set @q=N'Select '''+@b+''' [fy], case cast(month(i.invoicedate)/3.1 as int)     when 0 then 4 else cast(month(i.invoicedate)/3.1 as int) end [Qtr],     l.title,i.invoicenumber,i.invoicedate,i.sp,i.grandtotal from     ['+@c+'].dbo.invoicemain i inner join  ['+@c+'].dbo.ledgermain l on     l.ledgerid=i.ledgerid where (sp=0 or stocktype=''x'') and invoicetype=''DS'''

插入到@T exec [master].dbo.sp_executesql @q从@data提取下一个到@c,@b结束关闭@数据释放@数据选择 * 从@T返回结束

dvtswwa3

dvtswwa39#

这里有一个SP的例子,它同时返回一个表和一个返回值。我不知道你是否需要返回“返回值”,我也不知道MATLAB和它需要什么。

CREATE PROCEDURE test
AS 
BEGIN

    SELECT * FROM sys.databases

    RETURN 27
END

--Use this to test
DECLARE @returnval int

EXEC @returnval = test 

SELECT @returnval

相关问题