将多语句表值函数转换为内联TVF

时间:2016-03-28 16:54:07

标签: sql-server tsql sql-server-2012

我目前有一个多语句TVF,我出于性能原因想转换为内联TVF,而且我有一些困难。我已经阅读了很多关于类似问题的其他问题,但我仍然难以让我的工作。

这是我目前的多语句:

CREATE FUNCTION CN.Sample (@format nvarchar(100),  @oldText nvarchar(max))
RETURNS @Results TABLE (newtext nvarchar(max))
AS
BEGIN
   DECLARE @WebServiceURL nvarchar(256);
   DECLARE @pUrl nvarchar(256);
   DECLARE @pFP nvarchar(256) = NULL;
   DECLARE @enableMC bit = 'true';
   DECLARE @allowShort bit = 'false';
   DECLARE @identity nvarchar(100);
   DECLARE @allowRNG bit = 'false';
   DECLARE @UserName nvarchar(100) = '';
   DECLARE @Password nvarchar(100) = '';
   DECLARE @FileCache nvarchar(256) = '';
   DECLARE @Status varchar(10);

   SELECT  @WebServiceURL = WebServiceURL,
           @pUrl = PURL, 
           @identity = IdentityName ,
           @UserName = UserName,
           @Password = [Password],
           @FileCache = FileCache
   FROM [CN].[VCC]
   WHERE FormatName = @format;

   INSERT INTO @Results(newtext)
   SELECT data 
   FROM dbo.CLRSample (@WebServiceURL,@UserName,@Password,@format,@oldText);
   RETURN;

END

GO

select d.*
from dbo.EE
cross apply CN.Sample ('asdf',  EE.text) d

它引用的CLR功能:

CREATE FUNCTION [dbo].[CLRSample](@serviceURL [nvarchar](256),@userName nvarchar(100), @Password nvarchar(100),@format [nvarchar](100),@oldText nvarchar(max))
RETURNS TABLE (data nvarchar(500) )
AS 
EXTERNAL NAME [Sample.SqlClr].[SQLCLR.SampleFunctions].[Sample];
GO

如果有人对如何有效地将其转换为内联TVF有任何见解,我会很感激。

此外,我还有一个次要问题。在我的阅读中,很明显,内联比多语句更倾向于#34;如果可能的话,"但这意味着有些情况下使用内联语句是不可能的。我不确定这种情况会是什么样子以及它为什么会存在。如果有人对此有任何见解或例子,那也将不胜感激。

1 个答案:

答案 0 :(得分:2)

删除所有不必要的变量:

CREATE FUNCTION CN.Sample (@format nvarchar(100),  @oldText nvarchar(max))
RETURNS TABLE AS  
RETURN
(
   SELECT 
       (SELECT data FROM dbo.CLRSample (WebServiceURL, UserName, [Password], @format, @oldText)) AS data
   FROM [CN].[VCC]
   WHERE FormatName = @format      
)
GO