0

入力パラメーターに従ってサイズが設定された char 値を返すユーザー定義関数を作成したいと考えています。それが可能かどうかさえわかりませんが、とにかく聞いてみようと思いました。

したがって、次のようなクエリがあります。

SELECT 
Convert(char(10), SUBSTRING('Field1', 1, 10)) AS Field1,
Convert(char(20), SUBSTRING('Value2', 1, 20)) AS Field2

これを書くことを可能にする関数を書きたいと思います:

SELECT 
fn_ConvertAndPad('Field1', 10) AS Field1,
fn_ConvertAndPad('Field2', 20) AS Field2

出力を char(10) または char(20) として指定する方法はありますか?

これは私の(明らかに失敗した)試みでした:

ALTER FUNCTION [dbo].[fn_ConvertAndPad] 
(
    -- Add the parameters for the function here
    @input varchar(100),
    @length int
)
RETURNS char
AS
BEGIN
    -- Declare the return variable here
    DECLARE @Result char

    -- Add the T-SQL statements to compute the return value here
    DECLARE @blanks char(100)
    SET @blanks = ' '
    SELECT @Result = SUBSTRING(@input + @blanks, 1, @length)

    -- Return the result of the function
    RETURN @Result
END

いいえ、単に varchar を返すことはできません。フラットなテキスト出力用にパディングされた文字列が必要です。

4

1 に答える 1

2

私の推定では、操作中に戻り値の型を定義するために必要なものを取得するには、動的SQLを実行する必要があるため、ユーザー関数でこれを実行できるかどうかはわかりません。私が知る限り、これはプロシージャで実行できますが、関数では実行できません。

create proc [dbo].[p_ConvertAndPad] 
(
    @input varchar(100),
    @length int
)
AS


BEGIN

    declare @SQL varchar(256);

    set @SQL =  'DECLARE @Result char(' + cast(@length as varchar) + ');

SELECT @Result = SUBSTRING(''' + @input + ''', 1, ' +  cast(@length as varchar) + ')

Select @Result as [char(' + cast(@length as varchar) + ')]'

    Exec (@SQL)
END
GO

exec p_ConvertandPad 'Whoa I can change dynamically',  10  -- Change number to any number you want and it should change the return type.

これがあなたにとって十分に明確であるかどうかはわかりませんが、近いです:

create function [dbo].[f_ConvertAndPad] ( @string varchar(256), @len int)
returns sql_variant
as 

BEGIN
  declare @var sql_variant;

  select @var = cast(left(@string, cast(SQL_VARIANT_PROPERTY(@len,'maxlength') as int)) as char);

  return @var

END
GO

select [dbo].[f_ConvertAndPad]('Hey what are you looking at', 3), sql_variant_property([dbo].[f_ConvertAndPad]('Hey what are you looking at', 3), 'basetype')
于 2013-01-25T00:54:11.460 に答える