Ссылка на таблицу #temp из внешнего процесса - PullRequest
1 голос
/ 12 марта 2012

Используя SQL Server 2008, у меня есть две хранимые процедуры -

create procedure [dbo].[SH_Export_data] (@unit varchar(5)) as
  declare @sqlquery varchar(max) = 'select check_dt from chk_data where unit = ' 
    + @unit

  IF object_id('tempdb..#TempTbl') IS NOT NULL
    DROP TABLE #TempTbl
  create TABLE #TempTbl (
    col1 varchar(max), col2 varchar(max)
  )

  insert #TempTbl(col1)
  exec(@sqlquery)



create procedure [dbo].[SH_Export] as
  DECLARE @unit varchar(5), @sql varchar(max) = '', @file_name = 'c:\export.xls'

  DECLARE crsr CURSOR for
    select unit
    from communities

  OPEN crsr
  FETCH NEXT FROM crsr
  into @unit

  while @@FETCH_STATUS = 0 
  BEGIN
    set @sql = 'exec master..xp_cmdshell ''bcp "exec dbo.SH_Export_data ' +
      @unit + '" queryout "' + @file_name + '" -c -T "''
  END

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

при запуске -

exec dbo.SH_Export

Я получаю это сообщение об ошибке -

Error = [Microsoft][SQL Server Native Client 10.0][SQL Server] 
Invalid object name '#TempTbl'.

НО я могу работать без ошибок -

exec dbo.SH_Export_data 63058

что вызывает это?

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

Вам нужна глобальная временная таблица или постоянная таблица.

create TABLE ##TempTbl (
    col1 varchar(max), col2 varchar(max)
  )

или

create TABLE dbo.TempTbl (
    col1 varchar(max), col2 varchar(max)
  )

Они оба выполняют одно и то же - таблицу, к которой могут обращаться ваши внешние процессы (локальная таблица #temp ограничена областью действия вызывающей стороны).Разница в том, что глобальную временную таблицу ## не нужно явно отбрасывать, а постоянную.

Это означает, что если два пользователя вызывают эту хранимую процедуру одновременноодин из них выдаст ошибку (или полностью отменит то, что начал делать другой).Если вы можете использовать всю магию таблицы #temp в динамическом SQL, вы можете рассмотреть возможность добавления spid текущего сеанса или какого-либо другого уникализатора к имени таблицы.

0 голосов
/ 13 марта 2012

В дополнение к тому, что написал Аарон Бертран. Я добавлю, что вы также можете передать таблицу в качестве параметра с табличным значением.

Из MSDN: http://msdn.microsoft.com/en-us/library/bb510489.aspx

USE AdventureWorks2008R2;
GO

/* Create a table type. */
CREATE TYPE LocationTableType AS TABLE 
( LocationName VARCHAR(50)
, CostRate INT );
GO

/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE usp_InsertProductionLocation
    @TVP LocationTableType READONLY
    AS 
    SET NOCOUNT ON
    INSERT INTO [AdventureWorks2008R2].[Production].[Location]
           ([Name]
           ,[CostRate]
           ,[Availability]
           ,[ModifiedDate])
        SELECT *, 0, GETDATE()
        FROM  @TVP;
        GO

/* Declare a variable that references the type. */
DECLARE @LocationTVP 
AS LocationTableType;

/* Add data to the table variable. */
INSERT INTO @LocationTVP (LocationName, CostRate)
    SELECT [Name], 0.00
    FROM 
    [AdventureWorks2008R2].[Person].[StateProvince];

/* Pass the table variable data to a stored procedure. */
EXEC usp_InsertProductionLocation @LocationTVP;
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...