根据函数参数将列转换为动态大小

Jim*_*ner 3 t-sql sql-server sql-server-2005

我正在尝试向char(n)转换,其中n是函数参数

ALTER FUNCTION FixMe(@colName varchar, @width integer) RETURNS varchar
AS BEGIN
    RETURN CAST(@colName as char(@width))
END
Run Code Online (Sandbox Code Playgroud)

这段代码给出了错误

Incorrect syntax near '@width'.

我也试过用EXEC()via 执行:

EXEC('set @retval = CAST(@colName as char(' + @width + '))')
Run Code Online (Sandbox Code Playgroud)

但我接着去了

Invalid use of side-effecting or time-dependent operator in 'EXECUTE STRING' within a function.

Mar*_*ith 5

即使您确实设法在函数中使用它,您的RETURNS varchar语句也会导致结果varchar(1)在出路时被隐式转换为.

我认为这与您之前的问题有关,在这种情况下,这可能对您更有效.

ALTER FUNCTION FixMe(@colvalue VARCHAR(8000),
                     @width    INTEGER)
RETURNS VARCHAR(8000)
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS
  BEGIN
      RETURN REPLACE(RTRIM(@colvalue), ' ', ' ') + 
               CASE
                   WHEN @width > LEN(@colvalue) 
                   THEN REPLICATE(' ', @width - LEN(@colvalue))
                   ELSE ''
               END        
  END 
Run Code Online (Sandbox Code Playgroud)