프로시저 - pl sql 임시 테이블




저장 프로 시저의 결과를 임시 테이블에 삽입 (17)

가장 쉬운 솔루션 :

CREATE TABLE #temp (...);

INSERT INTO #temp
EXEC [sproc];

스키마를 모르는 경우 다음을 수행 할 수 있습니다. 이 방법에는 심각한 보안 위험이 있습니다.

SELECT * 
INTO #temp
FROM OPENROWSET('SQLNCLI', 
                'Server=localhost;Trusted_Connection=yes;', 
                'EXEC [db].[schema].[sproc]')

SELECT * INTO [temp table] FROM [stored procedure] 어떻게합니까? FROM [Table] 아니고 [temp table] 을 정의하지 않습니까?

BusinessLine 에서 모든 데이터를 Select 하여 tmpBusLine 작동합니다.

select *
into tmpBusLine
from BusinessLine

동일한 시도하고 있지만 데이터를 반환하는 stored procedure 를 사용하여 꽤 동일하지 않습니다.

select *
into tmpBusLine
from
exec getBusinessLineHistory '16 Mar 2009'

출력 메시지 :

메시지 156, 수준 15, 상태 1, 줄 2 'exec'키워드 근처의 구문이 잘못되었습니다.

출력 저장 프로 시저와 동일한 구조로 임시 테이블을 만드는 몇 가지 예를 읽었지만 잘 작동하지만 저장 프로 시저를 제공하지 않는 것이 좋습니다.


  1. 나는 다음과 같은 스키마와 데이터로 테이블을 생성하고있다.
  2. 저장 프로 시저를 만듭니다.
  3. 이제 프로 시저 결과가 무엇인지 알았으므로 다음 쿼리를 수행하고 있습니다.

    CREATE TABLE [dbo].[tblTestingTree](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ParentId] [int] NULL,
        [IsLeft] [bit] NULL,
        [IsRight] [bit] NULL,
    CONSTRAINT [PK_tblTestingTree] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET IDENTITY_INSERT [dbo].[tblTestingTree] ON
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (1, NULL, NULL, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (2, 1, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (3, 1, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (4, 2, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (5, 2, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (6, 3, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (7, 3, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (8, 4, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (9, 4, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (10, 5, 1, NULL)
    
    SET IDENTITY_INSERT [dbo].[tblTestingTree] OFF
    

    VALUES (10, 5, 1, NULL) SET IDENTITY_INSERT [dbo]. [tblTestingTree] 설정

    create procedure GetDate
    as
    begin
        select Id,ParentId from tblTestingTree
    end
    
    create table tbltemp
    (
        id int,
        ParentId int
    )
    insert into tbltemp
    exec GetDate
    
    select * from tbltemp;
    

Quassnoi가 저를 거기에 가장 많이 데려갔습니다. 그러나 한 가지가 빠졌습니다.

**** 저장 프로 시저에서 매개 변수를 사용해야했습니다. ****

그리고 OPENQUERY는 이것을 허용하지 않습니다 :

그래서 시스템을 작동시키는 방법을 찾았고 테이블 정의를 그렇게 엄격하게 만들 필요가 없으며 다른 저장 프로 시저 내부에서 다시 정의 할 필요가 없습니다 (물론 중단 될 가능성이 있습니다)!

예, 잘못된 결과가 있는 OPENQUERY 문을 사용하여 저장 프로 시저에서 반환 된 테이블 정의를 동적으로 만들 수 있습니다 ( NO RESULT SET 이 동일한 수의 필드를 반환하고 올바른 데이터가있는 데이터 집합과 같은 위치에있는 한).

일단 테이블이 생성되면, exec 저장 프로 시저를 하루 종일 임시 테이블에 사용할 수 있습니다.

그리고 (위에 표시된 바와 같이) 데이터 액세스를 사용 가능하게 설정해야합니다.

EXEC sp_serveroption 'MYSERVERNAME', 'DATA ACCESS', TRUE

암호:

declare @locCompanyId varchar(8)
declare @locDateOne datetime
declare @locDateTwo datetime

set @locDateOne = '2/11/2010'
set @locDateTwo = getdate()

--Build temporary table (based on bogus variable values)
--because we just want the table definition and
--since openquery does not allow variable definitions...
--I am going to use bogus variables to get the table defintion.

select * into #tempCoAttendanceRpt20100211
FROM OPENQUERY(DBASESERVER,
  'EXEC DATABASE.dbo.Proc_MyStoredProc 1,"2/1/2010","2/15/2010 3:00 pm"')

set @locCompanyId = '7753231'

insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo

set @locCompanyId = '9872231'

insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo

select * from #tempCoAttendanceRpt20100211
drop table #tempCoAttendanceRpt20100211

원래 제공된 정보를 가져 주셔서 감사합니다. 예. 마침내 다른 저장 프로 시저 또는 데이터베이스의 데이터를 사용할 때 이러한 위조 (엄격한) 테이블 정의 를 작성할 필요가 없으며 매개 변수도 사용할 수 있습니다.

참조 태그 검색 :

  • SQL 2005 임시 테이블에 프로 시저 저장

  • 저장 프로 시저 및 변수가있는 오픈 쿼리 2005

  • 변수가있는 openquery

  • 임시 테이블에 저장 프로 시저 실행

업데이트 : 임시 테이블에서는 작동하지 않으므로 수동으로 임시 테이블을 작성해야합니다.

Bummer notice : 임시 테이블 과 함께 작동하지 않습니다. http://www.sommarskog.se/share_data.html#OPENQUERY

참조 : 다음은 LOCALSERVER를 정의하는 것입니다. 이 예제에서는 키워드처럼 보일지 모르지만 실제로는 이름 일뿐입니다. 이것이 당신이하는 방법입니다 :

sp_addlinkedserver @server = 'LOCALSERVER',  @srvproduct = '',
                   @provider = 'SQLOLEDB', @datasrc = @@servername

연결된 서버를 만들려면 ALTER ANY SERVER 권한이 있거나 고정 서버 역할 sysadmin 또는 setupadmin의 구성원이어야합니다.

OPENQUERY는 SQL Server에 대한 새 연결을 엽니 다. 여기에는 몇 가지 의미가 있습니다.

OPENQUERY를 사용하여 호출하는 프로시 저는 현재 연결에서 작성된 임시 테이블을 참조 할 수 없습니다.

새 연결에는 자체 기본 데이터베이스 (sp_addlinkedserver로 정의, 기본값은 master)가 있으므로 모든 개체 지정에는 데이터베이스 이름이 포함되어야합니다.

OPENQUERY를 호출 할 때 열려있는 트랜잭션이 있고 잠금을 보유하고 있으면 호출 된 프로 시저는 사용자가 잠근 항목에 액세스 할 수 없습니다. 즉, 조심하지 않으면 자신을 막을 수 있습니다.

연결은 무료가 아니므로 성능 저하가 있습니다.


SQL 2012 이상을 사용할 수 있다면 운이 좋으면 dm_exec_describe_first_result_set_for_object 를 사용할 수 있습니다 dm_exec_describe_first_result_set_for_object

나는 방금 gotqn에 의해 제공된 SQL을 편집했다. 고마워.

프로 시저 이름과 이름이 같은 전역 임시 테이블이 만들어집니다. 임시 테이블은 나중에 필요할 때 사용할 수 있습니다. 다시 실행하기 전에 삭제하는 것을 잊지 마십시오.

    declare @procname nvarchar(255) = 'myProcedure',
            @sql nvarchar(max) 

    set @sql = 'create table ##' + @procname + ' ('
    begin
            select      @sql = @sql + '[' + r.name + '] ' +  r.system_type_name + ','
            from        sys.procedures AS p
            cross apply sys.dm_exec_describe_first_result_set_for_object(p.object_id, 0) AS r
            where       p.name = @procname

            set @sql = substring(@sql,1,len(@sql)-1) + ')'
            execute (@sql)
            execute('insert ##' + @procname + ' exec ' + @procname)
    end

이 저장된 proc 작업을 수행합니다.

CREATE PROCEDURE [dbo].[ExecIntoTable]
(
    @tableName          NVARCHAR(256),
    @storedProcWithParameters   NVARCHAR(MAX)
)
AS
BEGIN
    DECLARE @driver         VARCHAR(10)
    DECLARE @connectionString   NVARCHAR(600)
    DECLARE @sql            NVARCHAR(MAX)
    DECLARE @rowsetSql      NVARCHAR(MAX)

    SET @driver = '''SQLNCLI'''

    SET @connectionString = 
        '''server=' + 
            CAST(SERVERPROPERTY('ServerName') AS NVARCHAR(256)) + 
            COALESCE('\' + CAST(SERVERPROPERTY('InstanceName') AS NVARCHAR(256)), '') + 
        ';trusted_connection=yes'''

    SET @rowsetSql = '''EXEC ' + REPLACE(@storedProcWithParameters, '''', '''''') + ''''

    SET @sql = '
SELECT
    *
INTO 
    ' + @tableName + ' 
FROM
    OPENROWSET(' + @driver + ',' + @connectionString + ',' + @rowsetSql + ')'

    EXEC (@sql)
END
GO

이것은 약간의 재 작업입니다 : 실제로 작동하도록 테이블에 저장된 프로 시저 결과를 삽입하십시오 .

임시 테이블을 사용하려면 ##GLOBAL 테이블을 사용하고 나중에 삭제해야합니다.


이것은 약간 수정 된 질문에 대한 답변입니다. 사용자 정의 함수에 대한 저장 프로 시저의 사용을 포기할 수 있으면 인라인 테이블 반환 값 사용자 정의 함수를 사용할 수 있습니다. 이것은 본질적으로 테이블을 결과 집합으로 반환하는 저장 프로 시저 (매개 변수 사용)입니다. 그러므로 INTO 선언문과 잘 어울립니다.

여기에 좋은 기사 와 다른 사용자 정의 함수가 있습니다. 저장 프로 시저가 여전히 필요하다면 인라인 테이블 반환 값 사용자 정의 함수를 저장 프로 시저로 래핑 할 수 있습니다. 내장 프로 시저는 인라인 테이블 반환 사용자 정의 함수에서 select *를 호출 할 때 매개 변수를 전달합니다.

예를 들어, 특정 지역에 대한 고객 목록을 얻으려면 인라인 테이블 반환 사용자 정의 함수가 있습니다.

CREATE FUNCTION CustomersByRegion 
(  
    @RegionID int  
)
RETURNS TABLE 
AS
RETURN 
  SELECT *
  FROM customers
  WHERE RegionID = @RegionID
GO

그런 다음이 함수를 호출하여 결과에 대한 결과를 얻을 수 있습니다.

SELECT * FROM CustomersbyRegion(1)

또는 SELECT INTO를 수행하려면 다음과 같이하십시오.

SELECT * INTO CustList FROM CustomersbyRegion(1)

여전히 저장 프로 시저가 필요하면 다음과 같이 함수를 래핑하십시오.

CREATE PROCEDURE uspCustomersByRegion 
(  
    @regionID int  
)
AS
BEGIN
     SELECT * FROM CustomersbyRegion(@regionID);
END
GO

나는 이것이 원하는 결과를 얻기위한 가장 해킹이 덜한 방법이라고 생각한다. 추가 기능없이 기존 기능을 그대로 사용합니다. 내장 프로 시저에서 인라인 테이블 반환 사용자 정의 함수를 중첩하면 두 가지 방법으로 기능에 액세스 할 수 있습니다. 을 더한! 실제 SQL 코드에는 유지 보수 포인트가 하나뿐입니다.

OPENROWSET의 사용이 제안되었지만 이것은 OPENROWSET 함수가 (From Books Online)에 사용 된 것이 아닙니다.

OLE DB 데이터 원본의 원격 데이터에 액세스하는 데 필요한 모든 연결 정보를 포함합니다. 이 방법은 연결된 서버의 테이블에 액세스하는 대신에 OLE DB를 사용하여 원격 데이터에 연결하고 액세스하는 임시 방편입니다. OLE DB 데이터 원본에 대한 참조를 자주 사용하려면 연결된 서버를 대신 사용하십시오.

OPENROWSET을 사용하면 작업이 완료되지만 로컬 연결을 열어 데이터를 마샬링 할 때 약간의 추가 오버 헤드가 발생합니다. 또한 보안 위험을 초래하여 바람직하지 않을 수있는 특별 쿼리 권한이 필요하기 때문에 모든 경우에 옵션이 될 수 없습니다. 또한 OPENROWSET 방식은 둘 이상의 결과 집합을 반환하는 저장 프로 시저의 사용을 배제합니다. 하나의 저장 프로 시저에 여러 개의 인라인 테이블 값 사용자 정의 함수를 래핑하면이 작업을 수행 할 수 있습니다.


임시 테이블을 먼저 선언하지 않고이를 수행하려는 경우, 스토어드 프로 시저가 아닌 사용자 정의 함수를 작성하여 해당 사용자 정의 함수가 테이블을 리턴하도록 할 수 있습니다. 또는 저장 프로 시저를 사용하려면 다음과 같이 해보십시오.

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'

저장 프로 시저가 데이터를 검색하거나 수정하기 만합니까? 검색에만 사용되는 경우 다음과 같이 내장 프로 시저를 함수로 변환하고이를 선언 할 필요없이 CTE (Common Table Expressions)를 사용할 수 있습니다.

with temp as (
    select * from dbo.fnFunctionName(10, 20)
)
select col1, col2 from temp

그러나 CTE에서 검색해야 할 것은 무엇이든 한 문장으로 만 사용해야합니다. with temp as ... 할 수는 없지만 with temp as ... 몇 줄의 SQL을 사용하면 그것을 사용하려고합니다. 더 복잡한 조회를 위해 하나의 명령.에 여러 CTE를 가질 수 있습니다.

예를 들어,

with temp1020 as (
    select id from dbo.fnFunctionName(10, 20)
),
temp2030 as (
    select id from dbo.fnFunctionName(20, 30)
)
select * from temp1020 
where id not in (select id from temp2030)

저장 프로 시저의 첫 번째 레코드 세트를 임시 테이블에 삽입하려면 다음을 알아야합니다.

  1. 저장 프로 시저의 첫 번째 행 집합 만 임시 테이블에 삽입 할 수 있습니다
  2. 저장 프로 시저에서 동적 T-SQL 문 ( sp_executesql )을 실행하면 안됩니다.
  3. 먼저 임시 테이블의 구조를 정의해야합니다.

위의 제한으로 보일지 모르지만 그것은 완벽하게 이해할 수 있습니다 - sp_executesql 을 사용하는 경우 한 번에 두 개의 열과 한 번 열 수 있으며 여러 결과 집합이있는 경우 여러 테이블에도 삽입 할 수 없습니다. 하나의 T-SQL 문에서 두 테이블의 최대 값 ( OUTPUT 절 및 트리거 없음).

따라서 문제는 주로 EXEC ... INTO ... 문을 수행하기 전에 임시 테이블 구조를 정의하는 방법입니다.

첫 번째는 OBJECT_ID 와 함께 작동하고 두 번째와 세 번째는 Ad-hoc 쿼리와 함께 작동합니다. CROSS APPLY 사용할 CROSS APPLY 있고 동시에 여러 프로 시저에 대한 임시 테이블 정의를 작성할 수 있으므로 SP 대신 DMV를 사용하는 것을 선호합니다.

SELECT p.name, r.* 
FROM sys.procedures AS p
CROSS APPLY sys.dm_exec_describe_first_result_set_for_object(p.object_id, 0) AS r;

또한 매우 유용 할 수 있으므로 system_type_name 필드에주의하십시오. 열 완료 정의를 저장합니다. 예 :

smalldatetime
nvarchar(max)
uniqueidentifier
nvarchar(1000)
real
smalldatetime
decimal(18,2)

대부분의 경우 테이블 정의를 작성하기 위해 직접 사용할 수 있습니다.

그래서 대부분의 경우 (저장 프로 시저가 특정 기준과 일치하는 경우) 이러한 문제를 해결하기 위해 동적 문을 쉽게 작성할 수 있다고 생각합니다 (임시 테이블 만들기, 저장 프로 시저 결과 삽입, 데이터 필요) .

위의 개체는 동적 T-SQL 문이 실행되거나 임시 테이블이 저장 프로 시저에서 사용될 때와 같은 경우에 첫 번째 결과 집합 데이터를 정의하지 못합니다.


저장된 proc의 결과 테이블이 너무 복잡하여 "create table"문을 직접 작성하지 않고 OPENQUERY 또는 OPENROWSET을 사용할 수없는 경우 sp_help를 사용하여 열 및 데이터 유형 목록을 생성 할 수 있습니다. 일단 열의 목록이 있으면 필요에 맞게 서식을 지정해야합니다.

1 단계 : 출력 쿼리에 "#temp"를 추가합니다 (예 : "[...]에서 #temp로 [...] 선택).

가장 쉬운 방법은 proc에서 직접 출력 쿼리를 편집하는 것입니다. 저장 프로 시저를 변경할 수 없으면 내용을 새 쿼리 창에 복사하고 그곳에서 쿼리를 수정할 수 있습니다.

2 단계 : 임시 테이블에서 sp_help를 실행합니다. (예 : "exec tempdb..sp_help #temp")

임시 테이블을 만든 후 temp 테이블에서 sp_help를 실행하여 varchar 필드의 크기를 비롯한 열과 데이터 형식의 목록을 가져옵니다.

3 단계 : create table 문에 데이터 열 및 유형 복사

sp_help의 출력을 "create table"문으로 포맷하는 데 사용하는 Excel 시트가 있습니다. 당신은 아무것도 복사 할 필요가 없으며 복사하여 SQL 편집기에 붙여 넣기 만하면됩니다. 열 이름, 크기 및 형식을 사용하여 저장 프로 시저의 결과를 INSERT하는 데 사용할 수있는 "Create table #x [...]"또는 "declare @x table [...]"문을 생성합니다.

4 단계 : 새로 생성 된 테이블에 삽입

이제이 스레드에서 설명하는 다른 솔루션과 같은 쿼리가 생성됩니다.

DECLARE @t TABLE 
(
   --these columns were copied from sp_help
   COL1 INT,
   COL2 INT   
)

INSERT INTO @t 
Exec spMyProc 

이 기술을 사용하여 임시 테이블 ( #temp )을 테이블 변수 ( @temp )로 변환 할 수도 있습니다. 이것은 create table 문을 직접 작성하는 것보다 더 많은 단계 일 수 있지만 큰 프로세스에서 오타 및 데이터 유형 불일치와 같은 수동 오류를 방지합니다. 오타를 디버깅하는 것은 처음부터 쿼리를 작성하는 것보다 시간이 더 걸릴 수 있습니다.


배열 / 데이터 테이블을 저장 프로 시저로 전달하면 문제 해결 방법에 대한 또 다른 아이디어를 얻을 수 있습니다.

이 링크는 이미지 형식 매개 변수를 사용하여 저장 프로 시저에 전달할 것을 제안합니다. 그런 다음 저장 프로 시저에서 이미지가 원래 데이터를 포함하는 테이블 변수로 변환됩니다.

어쩌면 임시 테이블과 함께 사용할 수있는 방법이있을 수 있습니다.


암호

CREATE TABLE #T1
(
    col1 INT NOT NULL,
    col2 NCHAR(50) NOT NULL,
    col3 TEXT NOT NULL,
    col4 DATETIME NULL,
    col5 NCHAR(50) NULL,
    col6 CHAR(2) NULL,
    col6 NCHAR(100) NULL,
    col7 INT NULL,
    col8 NCHAR(50) NULL,
    col9 DATETIME NULL,
    col10 DATETIME NULL
)

DECLARE @Para1 int
DECLARE @Para2 varchar(32)
DECLARE @Para3 varchar(100)
DECLARE @Para4 varchar(15)
DECLARE @Para5 varchar (12)
DECLARE @Para6 varchar(1)
DECLARE @Para7 varchar(1)


SET @Para1 = 1025
SET @Para2 = N'6as54fsd56f46sd4f65sd'
SET @Para3 = N'XXXX\UserName'
SET @Para4 = N'127.0.0.1'
SET @Para5 = N'XXXXXXX'
SET @Para6 = N'X'
SET @Para7 = N'X'

INSERT INTO #T1
(
    col1,
    col2,
    col3,
    col4,
    col5,
    col6,
    col6,
    col7,
    col8,
    col9,
    col10,
)
EXEC [dbo].[usp_ProcedureName] @Para1, @Para2, @Para3, @Para4, @Para5, @Para6, @Para6

이게 도움이 되길 바란다. 적절하게 자격을 부여하십시오.


음, 임시 테이블을 만들어야하지만 올바른 스키마를 가질 필요는 없습니다. 기존 테이블을 수정하여 올바른 데이터와 함께 필수 열을 포함하는 저장 프로 시저를 만들었습니다. 유형 및 순서 (기존의 모든 열 삭제, 새 열 추가) :

GO
create procedure #TempTableForSP(@tableId int, @procedureId int)  
as   
begin  
    declare @tableName varchar(max) =  (select name  
                                        from tempdb.sys.tables 
                                        where object_id = @tableId
                                        );    
    declare @tsql nvarchar(max);    
    declare @tempId nvarchar(max) = newid();      
    set @tsql = '    
    declare @drop nvarchar(max) = (select  ''alter table tempdb.dbo.' + @tableName 
            +  ' drop column ''  + quotename(c.name) + '';''+ char(10)  
                                   from tempdb.sys.columns c   
                                   where c.object_id =  ' + 
                                         cast(@tableId as varchar(max)) + '  
                                   for xml path('''')  
                                  )    
    alter table tempdb.dbo.' + @tableName + ' add ' + QUOTENAME(@tempId) + ' int;
    exec sp_executeSQL @drop;    
    declare @add nvarchar(max) = (    
                                select ''alter table ' + @tableName 
                                      + ' add '' + name 
                                      + '' '' + system_type_name 
                           + case when d.is_nullable=1 then '' null '' else '''' end 
                                      + char(10)   
                              from sys.dm_exec_describe_first_result_set_for_object(' 
                               + cast(@procedureId as varchar(max)) + ', 0) d  
                                order by column_ordinal  
                                for xml path(''''))    

    execute sp_executeSQL  @add;    
    alter table '  + @tableName + ' drop column ' + quotename(@tempId) + '  ';      
    execute sp_executeSQL @tsql;  
end         
GO

create table #exampleTable (pk int);

declare @tableId int = object_Id('tempdb..#exampleTable')
declare @procedureId int = object_id('examplestoredProcedure')

exec #TempTableForSP @tableId, @procedureId;

insert into #exampleTable
exec examplestoredProcedure

참고 (이 임시 테이블을 사용하는 경우 예를 들어) sys.dm_exec_describe_first_result_set_for_object는 저장 프로 시저의 결과를 확인할 수없는 경우 작동하지 않습니다이.


전달되는 매개 변수를 알고 있고 sp_configure를 만들 수없는 경우이 매개 변수를 사용하여 저장 프로 시저를 편집하면 동일한 전역 테이블에 저장 될 수 있습니다.


나는 똑같은 문제를 만났으며 여기에 바울의 제안 에서 내가 한 일이있다 . 주요 부분은 여기에 NEWID()여러 사용자가 동시에 저장 프로 시저 / 스크립트, 글로벌 임시 테이블에 대한 고통을 피하기 위해 사용 하는 것입니다.

DECLARE @sql varchar(max) = '', 
@tmp_global_table varchar(255) = '##global_tmp_' + CONVERT(varchar(36), NEWID())
SET @sql = @sql + 'select * into [' + @tmp_global_table + '] from YOURTABLE'
EXEC(@sql)

EXEC('SELECT * FROM [' + @tmp_global_table + ']')

또 다른 방법은 형식을 만들고 PIPELINED를 사용하여 개체를 다시 전달하는 것입니다. 그러나 열을 아는 데만 제한됩니다. 하지만 다음과 같은 이점이 있습니다.

SELECT * 
FROM TABLE(CAST(f$my_functions('8028767') AS my_tab_type))

declare @temp table
(
    name varchar(255),
    field varchar(255),
    filename varchar(255),
    filegroup varchar(255),
    size varchar(255),
    maxsize varchar(255),
    growth varchar(255),
    usage varchar(255)
);
INSERT @temp  Exec sp_helpfile;
select * from @temp;






stored-procedures