我正在使用SQL Server 2012,并试图将临时表中的数据转换为另一个临时表,转换值时将信息从一个表复制到另一个表。这里是输入表的例子:在函数中执行存储过程或动态SQL
#IMPORT_DATA
SSN Plan StartDate
123-45-6789 Basic Life Insurance 1/1/2015
123-45-6789 Vision 1/1/2015
123-45-6789 Dental 1/1/2015
我需要将此数据转换为这样的事情:
#STAGE_DATA
SSN Plan StartDate
123456789 BLI 20150101
123456789 VIS 20150101
123456789 DTL 20150101
我有一个定义的SQL脚本,将转换数据,但转换表在函数中执行动态SQL时遇到问题。
我正在使用一个表值函数来加载#STAGE_DATA
,传递#IMPORT_DATA
作为XML。该表函数是:
create function dcBPI.TranslateBenefitsStagingTable_FN
(
@XmlData xml
, @TranslationType varchar(50)
, @Company varchar(3) = null
)
returns @ReturnTable table (
[RowID] [int]
, [SSN] [varchar](9) NULL
, [Plan] [varchar](3) NULL
, [StartDate] [varchar](8) NULL
)
as
begin
insert into @ReturnTable ([RowID], [EmpSSN])
select [Table].[Column].value('ID[1]', '[int]') as 'RowID' -- no translation for RowID
, dcBPI.TranslateSourceValue_FN('Benefit', 'SSN', [Table].[Column].value('SSN[1]', '[varchar](11)'), @Company) as 'SSN'
, dcBPI.TranslateSourceValue_FN('Benefit', 'Plan', [Table].[Column].value('Plan[1]', ' [varchar](3)'), @Company) as 'Plan'
, dcBPI.TranslateSourceValue_FN('Benefit', 'StartDate', [Table].[Column].value('StartDate[1]', ' [varchar](10)'), @Company) as 'StartDate'
from @XmlData.nodes('//row') as [Table]([Column])
return
end
go
翻译功能是:
create function dcBPI.TranslateSourceValue_FN
(
@TranslationType varchar(50)
, @DestinationHeader varchar(255)
, @SourceValue varchar(255)
, @Company varchar(3) = null
)
returns varchar(255)
as
begin
declare @DestinationValue varchar(255) = 'Missing'
, @sql nvarchar(max) = ''
if len(rtrim(@Company)) = 0 set @Company = null
select @sql =
select
distinct td.DestinationValue
from dcBPI.TranslationData td
where (
td.Company = @Company
or td.Company = 'All'
)
and td.TranslationType = @TranslationType
and td.DestinationHeader = @DestinationHeader
and td.SourceValue = @SourceValue
)
exec sp_executesql @sql, N'@OutputValue nvarchar(max) OUTPUT', @OutputValue = @DestinationValue OUTPUT
return @DestinationValue
end
go
当我执行的表值函数(这反过来执行TranslateSourceValue_FN
),我得到一个错误信息:
只有函数和一些扩展存储过程可以从函数内部执行 。
我从其他文章中知道我不能从函数调用动态SQL,那么是否有另一种方法来完成我正在尝试做的事情?
编辑(加@sql例子)
的SQL是使用简单的SELECT语句,如:
select replace('123-45-6789' '-', '')
select PlanCode from CodeTable where Plan = @Plan'
@srutzky见编辑为'@ sql'例子。 – BrianKE