2011-03-02 59 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