SQL Server 저장 프로시저 테이블 반환
두 가지 매개 변수를 사용하는 저장 프로시저가 있습니다.Server Management Studio에서 성공적으로 실행할 수 있습니다.그것은 제가 기대하는 결과를 보여줍니다.그러나 반환 값도 반환합니다.
이 행을 추가했습니다.
SELECT 'Return Value' = @return_value
저장 프로시저가 MATLAB에서 이 저장 프로시저를 호출할 때 반환 값이 아닌 결과에 표시된 표를 반환하고 싶습니다. 반환되는 모든 것은 true 또는 false입니다.
저장 프로시저에서 반환할 항목을 지정해야 합니까?그렇다면 4개 열(varchar(10), float, float, float)의 테이블을 어떻게 지정합니까?
프로시저는 테이블을 반환할 수 없습니다.그러나 프로시저의 테이블에서 선택하여 다음과 같은 테이블(또는 테이블 변수)로 이동할 수 있습니다.
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
이 작업은 일관성을 높이고 코드를 단순화하기 위해 표 유형을 사용하여 자주 수행합니다."를 반환할, 하고 "표"를 사용하여 반환할 수 .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
테이블을 반환하고 쿼리에 사용할 수 있는 함수를 만드는 것을 고려해 보십시오.
https://msdn.microsoft.com/en-us/library/ms186755.aspx
함수와 프로시저의 주요 차이점은 함수가 테이블을 변경하지 않는다는 것입니다.값만 반환합니다.
이 예에서는 주어진 테이블에 null이거나 비어 있지 않은 모든 열의 개수를 제공하는 쿼리를 만듭니다.
이것을 청소하는 방법은 아마 여러 가지가 있을 것입니다.하지만 그것은 기능을 잘 보여줍니다.
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
저도 비슷한 상황이 있었는데 절차 내부의 임시 테이블을 사용하여 해결했으며 원래 저장 프로시저에서 동일한 필드를 반환했습니다.
CREATE PROCEDURE mynewstoredprocedure
AS
BEGIN
INSERT INTO temptable (field1, field2)
EXEC mystoredprocedure @param1, @param2
select field1, field2 from temptable
-- (mystoredprocedure returns field1, field2)
END
결과 세트와 반환 값을 모두 원하는 경우 반환 값 대신 out 매개 변수를 사용할 수 있습니다.
CREATE PROCEDURE proc_name
@param int out
AS
BEGIN
SET @param = value
SELECT ... FROM [Table] WHERE Condition
END
GO
저장 프로시저에서 반환하는 상태 값은 INT 데이터 유형만 될 수 있습니다.RETURN 문에서 다른 데이터 유형을 반환할 수 없습니다.
모든 저장 프로시저는 실행 상태 값 또는 반환 코드로 알려진 정수 값을 반환할 수 있습니다.
SP에서 테이블을 반환하려면 SP 내의 SELECT에서 반환된 레코드 세트를 작업하거나 XML 데이터 유형을 전달하는 OUTPUT 변수에 연결해야 합니다.
HTH,
존.
이 질문은 매우 오래되었지만 소프트웨어 개발의 새로운 질문으로서 저는 제가 배운 것을 공유하는 것을 멈출 수 없습니다.d
저장 프로시저 만들기:
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
저장 프로시저 실행:
(SQL에서 저장 프로시저 실행을 테스트하려는 경우)
EXEC usp_ValidateUSer @UserName='admin', @Password='admin'
출력:
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 fetch from @data into @c, @bend close @data deallocate @data select * from @T return end
다음은 테이블과 반환 값을 모두 반환하는 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
언급URL : https://stackoverflow.com/questions/22963939/sql-server-stored-procedure-return-a-table
'programing' 카테고리의 다른 글
중첩된 Git 저장소? (0) | 2023.06.20 |
---|---|
문자 오라클 뒤에 문자열을 가져오는 방법 (0) | 2023.06.20 |
SQL Server: 테이블 메타데이터 추출(설명, 필드 및 해당 데이터 유형) (0) | 2023.06.20 |
Firebase CLI: "단일 페이지 앱으로 구성(모든 URL을 /index.html에 다시 쓰기)" (0) | 2023.06.20 |
OpenXML에서 사용자 정의 열 너비 만들기(excel) (0) | 2023.06.20 |