比如参数(字符类型)的内容是 2.01,2.03,2.07
以前试过把这个查询语句放在字符串中,然后exec 这个字符串。但是我存储过程不是单纯的select 语句,而且超8000字符。使用的是SQL2005,2005有没有新方法解决?其实我也想到一个方法,就是把这个字符串按逗号分隔,然后把2.01,2.03,2.07插入到只有一个列的临时表中。就可以in select 这个临时表了。有没有快速的方法把2.01,2.03,2.07插入到临时表?
以前试过把这个查询语句放在字符串中,然后exec 这个字符串。但是我存储过程不是单纯的select 语句,而且超8000字符。使用的是SQL2005,2005有没有新方法解决?其实我也想到一个方法,就是把这个字符串按逗号分隔,然后把2.01,2.03,2.07插入到只有一个列的临时表中。就可以in select 这个临时表了。有没有快速的方法把2.01,2.03,2.07插入到临时表?
set @in = ',2.01,2.03,2.07,'select * from tb where charindex(','+colname+',', @in) > 0
-- or
select * from tb where @in like '%,'+colname+',%'
SELECT cast(b.v as numeric(12,2)) FROM
(SELECT CAST('<r>' + REPLACE(@s,',','</r><r>') + '</r>' AS XML) x) a
CROSS APPLY
(SELECT v=t.x.value('.','VARCHAR(10)') FROM a.x.nodes('//r') AS t(x) ) b
declare @str varchar(8000),@start int,@end int
set @str = 2.01,2.03,2.07,' --如果输入串不是以分割字符结尾,则 set @str = @str+‘,’
set @start = 1
set @end = charindex(',',@str,@start) --第一次出现分割字符的下标位置
while(@end<>0)
begin
print substring(@str,@start,@end-@start) --输出成员;(@end-@start)的值等于成员的长度,不包含分割字符。
set @start = @end+1
set @end = charindex(',',@str,@start) --输出最后一个成员后,@end =0,则退出循环。
end
set @str = '2.01,2.03,2.07,' --如果输入串不是以分割字符结尾,则 set @str = @str+‘,’
set @start = 1
set @end = charindex(',',@str,@start) --第一次出现分割字符的下标位置
while(@end<>0)
begin
print substring(@str,@start,@end-@start) --输出成员;(@end-@start)的值等于成员的长度,不包含分割字符。
set @start = @end+1
set @end = charindex(',',@str,@start) --输出最后一个成员后,@end =0,则退出循环。
end
使用的是SQL2005,2005有没有新方法解决?----------
8000字符如果是變量改為varchar(max)--Transact-SQL 預存程序的大小上限是 128 MB
SET @s=''
SELECT
TOP 8000 @s=@s+','+RTRIM(a.ID)
FROM syscolumns a,syscolumns b
SET @s=STUFF(@s,1,1,'')SELECT LEN(@s)--測試字符66776
-----------以上為生成測試變量CREATE TABLE #臨時表(ID int)SET @s='insert #臨時表 select '+REPLACE(@s,',',' union all select ')
EXEC(@s)SELECT * FROM #臨時表
那就要使用 varchar(max)
set @in = '2.01,2.03,2.07'会把01,03,07的都查出来了