【发布时间】:2016-01-07 13:47:01
【问题描述】:
我正在使用 SQL Server 2012 并尝试将临时表中的数据转换为另一个临时表,并在将信息从一个表复制到另一个表时转换值。以下是输入表的示例:
#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)时,我收到以下错误消息:
只能执行函数和一些扩展存储过程 从函数内部。
我从其他文章中知道我无法从函数中调用 Dynamic SQL,那么还有其他方法可以完成我想要做的事情吗?
编辑(添加了@sql 示例)
要使用的 SQL 是简单的选择语句,例如:
select replace('123-45-6789' '-', '')select PlanCode from CodeTable where Plan = @Plan'
【问题讨论】:
-
@srutzky 查看
@sql示例的编辑。
标签: sql-server function sql-server-2012 dynamic-sql sqlclr