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
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
解决方案 »
- 再问条有点复杂的SQL语句
- UNIQUE 约束问题
- 求传一参数,返回数据的问题?
- SQL SERVER的默认实例名称MSSQLSERVER在安装是可以改写的吗?
- 如何在MS SQL Server 上查询Sybase的数据?否则只好赶到招聘职场了!!:<
- 关于输出xml的问题
- 如何实现程序对数据表属性列的动态管理?
- 100分求助:数据库合并问题:希望合并带自动编号(由于设计问题,该编号涉及到其他表的检索)的同质数据库
- 请问sqlserver的licence有什么用?
- 弱弱地问,两个表union后的数据是放在什么地方的呢?
- sql2005 存储过程 ROW_NUMBER 排序问题
- 请问这样的数据排序该如何进行?大侠进来。
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
在函数内的 'INSERT EXEC' 中对带副作用的或依赖于时间的运算符的使用无效。
要求@ColunmValue是一个记录集而你的参数实际是'1,3,6',所以得组合为sql字符串再执行或者改为这样:
where ','+@ColunmValue+',' like '%,'+id+',%'
函数1,拆分字符,返回单列的表1. 需要的参数@ColunmValue nvarchar(50)
函数2,调用函数1做条件就行。 需要的参数@ColunmValue nvarchar(50)
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*/