SQL 函数 Return 适当长度的字符串
SQL Function Return Appropriate Length String
下面是一个将输入字符串填充到输入字符串指定端所需长度的函数。当由 SSIS 执行时,元数据不是 return 所需的长度。我需要它 return 适合 SSIS 的数据长度。
CREATE FUNCTION [dbo].[udf_FillField]
(
@StringOrg nvarchar(max), --Original string
@LengthOfStringOutPut int, --Length of output sting
@FillChr nvarchar(1), --Char to pad the original string
@LRJustified nvarchar(1) --Left or right justified
)
RETURNS nvarchar(max)
AS
BEGIN
-- Declare Variable(s)
DECLARE @Result nvarchar(max)
-- Left Justified
IF @LRJustified = 'L'
BEGIN
SET @Result =
LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut) +
REPLICATE(@FillChr, (@LengthOfStringOutPut - LEN(LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut))))
END
-- Right Justified
IF @LRJustified = 'R'
BEGIN
SET @Result =
REPLICATE(@FillChr, (@LengthOfStringOutPut - LEN(LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut)))) +
LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut)
END
-- Incorrect Parameter Input
IF @LRJustified <> 'R' AND @LRJustified <> 'L'
BEGIN
SET @Result =
NULL
END
-- Output Data
RETURN @Result
END
您的 UDF 定义为返回 nvarchar(max)
。 SSIS 将查看该函数的元数据,查看它指定它 returns nvarchar(max)
或 DT_NTEXT,因为 SSIS 将对其进行分类,然后完成验证。
您能够使用函数的唯一方法是将结果显式转换为适当的大小。
SELECT
CAST(dbo.udf_FillField(T.col1, 100, N'X', N'R') AS nvarchar(100)) AS Col1
FROM
dbo.MyTable AS T;
附带说明一下,UDF 感觉就像代码重用,这就是我们作为开发人员所接受的教育。但在 SQL 服务器中,它们是可憎的,因为优化器无法为函数需要多少工作产生准确的成本,所以它猜测,100 次中有 100 次,它可能是错误的。您将获得所封装的任何业务逻辑的一致实施,但根据所需的数据量和逻辑,性能损失可能会很严重。
下面是一个将输入字符串填充到输入字符串指定端所需长度的函数。当由 SSIS 执行时,元数据不是 return 所需的长度。我需要它 return 适合 SSIS 的数据长度。
CREATE FUNCTION [dbo].[udf_FillField]
(
@StringOrg nvarchar(max), --Original string
@LengthOfStringOutPut int, --Length of output sting
@FillChr nvarchar(1), --Char to pad the original string
@LRJustified nvarchar(1) --Left or right justified
)
RETURNS nvarchar(max)
AS
BEGIN
-- Declare Variable(s)
DECLARE @Result nvarchar(max)
-- Left Justified
IF @LRJustified = 'L'
BEGIN
SET @Result =
LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut) +
REPLICATE(@FillChr, (@LengthOfStringOutPut - LEN(LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut))))
END
-- Right Justified
IF @LRJustified = 'R'
BEGIN
SET @Result =
REPLICATE(@FillChr, (@LengthOfStringOutPut - LEN(LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut)))) +
LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut)
END
-- Incorrect Parameter Input
IF @LRJustified <> 'R' AND @LRJustified <> 'L'
BEGIN
SET @Result =
NULL
END
-- Output Data
RETURN @Result
END
您的 UDF 定义为返回 nvarchar(max)
。 SSIS 将查看该函数的元数据,查看它指定它 returns nvarchar(max)
或 DT_NTEXT,因为 SSIS 将对其进行分类,然后完成验证。
您能够使用函数的唯一方法是将结果显式转换为适当的大小。
SELECT
CAST(dbo.udf_FillField(T.col1, 100, N'X', N'R') AS nvarchar(100)) AS Col1
FROM
dbo.MyTable AS T;
附带说明一下,UDF 感觉就像代码重用,这就是我们作为开发人员所接受的教育。但在 SQL 服务器中,它们是可憎的,因为优化器无法为函数需要多少工作产生准确的成本,所以它猜测,100 次中有 100 次,它可能是错误的。您将获得所封装的任何业务逻辑的一致实施,但根据所需的数据量和逻辑,性能损失可能会很严重。