我目前有一个多语句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;如果可能的话,"但这意味着有些情况下使用内联语句是不可能的。我不确定这种情况会是什么样子以及它为什么会存在。如果有人对此有任何见解或例子,那也将不胜感激。
答案 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