create function [dbo].[GetUserName](@ColunmValue nvarchar(50))
returns varchar(8000)
as
begin
DECLARE @RetVal varchar(8000) 
SET @RetVal = '' 
select @RetVal = name + ',' + @RetVal  from [Dealer] 
where id in (@ColunmValue)
IF LEN(@RetVal) > 0 
SET @RetVal = LEFT(@RetVal, LEN(@RetVal) - 1)
return (@Retval)
end
我是想通过上述的方法,获取所有用户名,条件是用户id集合,如:“1,2,3,”,“2,3,5,”
等等。
如果用户id只有一个的时候没问题,但是多了就会报错,类型转换失败。
各位看看怎么定义这个变量?SQL变量函数select

解决方案 »

  1.   

    个人建议从前端对你的id列进行拆分,变成一个表,然后In,不然当列太多的时候,你这种写法会导致编译失败
      

  2.   

    create function [dbo].[GetUserName](@ColunmValue nvarchar(50))
    returns varchar(8000)
    as
    begin
    DECLARE @RetVal varchar(8000) 
    SET @RetVal = '' 
    select @RetVal = name + ',' + @RetVal  from [Dealer] 
    where id in (@ColunmValue) --这儿写的不对,如果你传了个"1,2,3",会把"1,2,3"转化成整型,会报错的
    IF LEN(@RetVal) > 0 
    SET @RetVal = LEFT(@RetVal, LEN(@RetVal) - 1)
    return (@Retval)
    END
    go--改成:
    create function [dbo].[GetUserName](@ColunmValue nvarchar(50))
    returns varchar(8000)
    as
    begin
    DECLARE @RetVal varchar(8000) 
    SET @RetVal = ''
    DECLARE @temp TABLE(NAME NVARCHAR(255))
    INSERT @temp 
    EXEC('SELECT name FROM [Dealer] where id in ('+ @ColunmValue +')')
    select @RetVal = name + ',' + @RetVal  from @temp
    IF LEN(@RetVal) > 0 
    SET @RetVal = LEFT(@RetVal, LEN(@RetVal) - 1)
    return (@Retval)
    END
      

  3.   

    你确定你这个能用,为什么我的会报错?
    在函数内的 'INSERT EXEC' 中对带副作用的或依赖于时间的运算符的使用无效。
      

  4.   

    where id in (@ColunmValue)
    要求@ColunmValue是一个记录集而你的参数实际是'1,3,6',所以得组合为sql字符串再执行或者改为这样:
    where  ','+@ColunmValue+',' like '%,'+id+',%'
      

  5.   

    还有一种办法,写2个函数
    函数1,拆分字符,返回单列的表1. 需要的参数@ColunmValue nvarchar(50)
    函数2,调用函数1做条件就行。 需要的参数@ColunmValue nvarchar(50)
      

  6.   

    where (','+@ColumnValue+',')like '%,'+cast (ID as varchar)+',%' 
      

  7.   

    CREATE TABLE [Dealer] (ID INT, NAME VARCHAR(10))
    INSERT Dealer
    SELECT 1, 'name1' UNION ALL
    SELECT 2, 'name2' UNION ALL
    SELECT 3, 'name3' UNION ALL
    SELECT 4, 'name4'
    --方法1
    create function [dbo].[GetUserName](@ColunmValue nvarchar(50))
    returns varchar(8000)
    as
    begin
        DECLARE @RetVal varchar(8000) 
        SET @RetVal = '' 
        select @RetVal = name + ',' + @RetVal  from [Dealer] 
        where CHARINDEX(','+LTRIM(id)+',', ','+@ColunmValue+',') > 0
        IF LEN(@RetVal) > 0 
        SET @RetVal = LEFT(@RetVal, LEN(@RetVal) - 1)
        return (@Retval)
    END
    SELECT dbo.[GetUserName]('1,3,2')
    /*name3,name2,name1*/
    go
    --方法2
    ALTER function [dbo].[GetUserName](@ColunmValue nvarchar(50))
    returns varchar(8000)
    as
    begin
        DECLARE @RetVal varchar(8000) 
        SET @RetVal = '' 
    ;WITH cte AS  
    (
    SELECT
    rowid=1,  
    string = CAST(LEFT(@ColunmValue, CHARINDEX(',', @ColunmValue + ',') - 1) AS int),
    Split = CAST(STUFF(@ColunmValue + ',', 1, CHARINDEX(',', @ColunmValue + ','), '') AS NVARCHAR(MAX))
    UNION ALL
    SELECT
    rowid=rowid+1,
    string = CAST(LEFT(Split, CHARINDEX(',', Split) - 1) AS int),
    Split = CAST(STUFF(Split, 1, CHARINDEX(',', Split), '') AS NVARCHAR(MAX))
    FROM cte
    WHERE Split > ''
    )
    SELECT @RetVal = @RetVal+B.NAME+','
    FROM cte a
    INNER JOIN [Dealer] b
    ON a.string = b.id
    OPTION (MAXRECURSION 0) --递归次数无限制
        IF LEN(@RetVal) > 0 
        SET @RetVal = LEFT(@RetVal, LEN(@RetVal) - 1)
        return (@Retval)
    END
    goSELECT dbo.[GetUserName]('1,3,2')
    /*name1,name2,name3*/