2011-03-02 55 views
3

我想投的东西CHAR(n),其中n是一个函数参数铸铁柱基于函数的参数动态大小

ALTER FUNCTION FixMe(@colName varchar, @width integer) RETURNS varchar 
AS BEGIN 
    RETURN CAST(@colName as char(@width)) 
END 

此代码是给人一个错误

Incorrect syntax near '@width'.

我也试图通过与EXEC()执行此:

EXEC('set @retval = CAST(@colName as char(' + @width + '))') 

但我然后运行到

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

回答

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 
+0

非常好。这正是我需要的=) – 2011-03-03 00:10:30

+0

你是男人:) – 2011-03-03 00:35:26