我有一个存储过程,需要一个输入参数@CategoryKeys varchar,并将其内容解析到临时表中#CategoryKeys。
@CategoryKeys varchar
#CategoryKeys
-- create the needed temp table. CREATE TABLE #CategoryKeys ( CategoryKey SMALLINT ); -- fill the temp table if necessary IF Len(rtrim(ltrim(@CategoryKeys))) > 0 BEGIN INSERT INTO #CategoryKeys (CategoryKey) SELECT value FROM dbo.String_To_SmallInt_Table(@CategoryKeys, ','); END
如果临时表有行,我想将表传递到单独的存储过程中。我将如何在单独的过程中创建参数来保存临时表?
当创建#TEMP表时,“作用域”大于创建它的过程。
下面是一个示例:
IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspProc002' ) BEGIN DROP PROCEDURE [dbo].[uspProc002] END GO CREATE Procedure dbo.uspProc002 AS BEGIN /* Uncomment this code if you want to be more explicit about bad "wiring" */ /* IF OBJECT_ID('tempdb..#TableOne') IS NULL begin THROW 51000, 'The procedure expects a temp table named #TableOne to already exist.', 1; end */ /* Note, I did not Create #TableOne in this procedure. It "pre-existed". An if check will ensure that it is there. */ IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL begin Insert into #TableOne ( SurrogateKey , NameOf ) select 2001, 'uspProc002' end END GO IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspProc001' ) BEGIN DROP PROCEDURE [dbo].[uspProc001] END GO CREATE Procedure dbo.uspProc001 ( @Param1 int ) AS BEGIN IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL begin drop table #TableOne end CREATE TABLE #TableOne ( SurrogateKey int , NameOf varchar(12) ) Insert into #TableOne ( SurrogateKey , NameOf ) select 1001, 'uspProc001' Select * from #TableOne EXEC dbo.uspProc002 Select * from #TableOne IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL begin drop table #TableOne end END GO exec dbo.uspProc001 0
如此说来,请不要对其中的任何代码进行编码。 它与全局变量的SQL等效,因此难以维护和容易出错。