Хранимая процедура: превратить имя таблицы в переменную таблицы
Есть довольно много подобных Вопросов, однако я не совсем нашел то, что искал. Поскольку использование динамического SQL в хранимой процедуре может быстро стать громоздким, я хочу передать имя таблицы (Varchar) в хранимую процедуру, превратить это имя таблицы в переменную таблицы и впоследствии работать с этой переменной таблицы для остальной части процедуры. Я не могу понять код для этого.
Я работаю в SSMS на SQL Server 2008R2. В настоящее время мой код выглядит примерно так. Я отстаю от средней части, чтобы создать переменную таблицы @Table из переменной @TableName Varchar
CREATE Procedure [dbo].StoredProc(@Tablename Varchar)
AS
Begin
Declare @Table Table (ColA Varchar, ColB Float)
Declare @result float
-- Something like Insert @Table Select * From @Tablename using Dynamic sql or sth. similar
Select @result = Select sum(ColB) From @Table
End
3 ответа
Вы можете объединить динамический SQL и временную таблицу следующим образом:
CREATE Procedure [dbo].StoredProc(@Tablename Varchar(100))
AS
Begin
create table #TempTbl (ColA Varchar(100), ColB Float);
Declare @result float
declare @dynSQL varchar(max);
select @dynSQL = 'insert into #TempTbl select
cast(val1 as varchar(100)) as ColA,
cast(val2 as float) as ColB from ' + COALESCE( @Tablename, 'NULL');
-- Tablename should contain schema name, 'dbo.' for example
exec( @dynSQL );
Select @result = sum(ColB) From #TempTbl
drop table #TempTbl;
return @Result;
End
Вы должны установить оператор, который вам нужен в переменной:
SET @sqlString='INSERT ' + @Table + ' SELECT * FROM ' + @Tablename
используя Dynamic SQL или STH. аналогичный"
и затем выполните это:
EXEC sp_executesql @sqlString
USE AdventureWorks2012;
DECLARE @TableName NVARCHAR(MAX);
DECLARE @Copy TABLE
(
[ShiftID] [tinyint] NOT NULL,
[Name] [dbo].[Name] NOT NULL,
[StartTime] [time](7) NOT NULL,
[EndTime] [time](7) NOT NULL,
[ModifiedDate] [datetime] NOT NULL
);
SET @TableName = N'[HumanResources].[Shift]';
INSERT INTO @Copy
EXEC ('SELECT * FROM ' + @TableName);
SELECT * FROM @Copy;