一存储过程中有3个参数
如下:
ALTER PROCEDURE Pro_AddIDS(
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int
)
其中@IDS="1,5,9,6,10"这样的数据,需要将这些数据分割出来,插到一张表中结构如下:
CREATE TABLE IDS
(
ID INT,
IDName VARCHAR(50),
IDLevel int
)
假设:@IDS="1,5,9,6,10",IDName ="hello" 得到如下结果
/*
IDS IDName IDLevel
----------- --------------------------------------------------
1 hello null
5 hello null
9 hello null
6 hello null
10 hello null请帮下忙,谢谢!
如下:
ALTER PROCEDURE Pro_AddIDS(
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int
)
其中@IDS="1,5,9,6,10"这样的数据,需要将这些数据分割出来,插到一张表中结构如下:
CREATE TABLE IDS
(
ID INT,
IDName VARCHAR(50),
IDLevel int
)
假设:@IDS="1,5,9,6,10",IDName ="hello" 得到如下结果
/*
IDS IDName IDLevel
----------- --------------------------------------------------
1 hello null
5 hello null
9 hello null
6 hello null
10 hello null请帮下忙,谢谢!
解决方案 »
- sqlserver恢复模式为simple,是否还可以进行事务复制
- 一家美容公司在同一个城市的不同地点开了三个美容店要联起来共享数据库,采用哪种编成方法比较合适,开发费多少?功能大致要求如下:
- sql server 数据库中的表不设主键与设一个无意义的标识种子主键有什么区别
- 问题:SQL Server 2005 Studio连接外网的SQL server2005 Express服务器,连接不上
- access的upsizing问题(导出为sql server)
- 大家进来看看,这个问题怎么处理,谢谢
- top系列——5
- 如何得到SQLSERVER某个数据库中所有表的表名?
- 为什么我新装的win2000server别的什么也没装,然后装sql2000企业版还是配置服务器失败,已经重装了3次系统了
- SQL拆分数据
- SQL2000中文问题
- 问个问题(导数据问题)
2006-01-12
2006-02-13
2006-03-15
2006-11-11
2003-1-1
declare @Days varchar(4000)
declare @tmpDay varchar(10)
set @Days='2006-01-12|2006-02-13|2006-03-15|2006-11-11|2003-1-1'
set @tmpDay=''
declare @i int
set @i=0
while @i<len(@Days)
begin
set @i=@i+1
if SUBSTRING(@Days,@i,1)='|'
begin
print left(@Days,@i-1)
set @Days=SUBSTRING(@Days,@i+1,len(@Days))
set @i=0
end
end
print @Days
输出结果:
2006-01-12
2006-02-13
2006-03-15
2006-11-11
2003-1-1一字段信息包括如下:李三|李三@d.com|公司|单位地址|
我将查询用(Select)只列出李三及单位地址的方法?create table #t(c1 varchar(100))
insert into #t select 'li4|33@com|mircrosoft|china|'
insert into #t select 'zhang3|[email protected]|IBM|USA|'
insert into #t select '李三|李三@d.com|公司|单位地址|'
select substring(c1,1,charindex('|',c1)-1) as name,
reverse(substring(reverse(c1) , 2 , charindex('|' , reverse(c1) , 2) - 2)) as address from #tdrop table #tname address
----- -------
li4 china
zhang3 USA
李三 单位地址(所影响的行数为 3 行)
declare @s varchar(20)
set @s='06G512753-08-01'
select
parsename(t.s,3) part1,
parsename(t.s,2) part2,
parsename(t.s,1) part3
from
(select replace(@s,'-','.') as s) t
select 1,'A10' union all
select 2,'A20,A20S' union all
select 3,'A30,A30K,A30M' union all
select 4,'A301' union all
select 5,'A301M'
select * from tblTest
go-- 建立一个辅助的临时表就可以了
SELECT TOP 8000
id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b
-- 这个辅助表是什么含义,为下一步铺垫的目的是什么?
-- 以上生成一个临时表
SELECT
A.PdID,
PdName = SUBSTRING(A.PdName, B.ID, CHARINDEX(',', A.PdName + ',', B.ID) - B.ID) --这个SUBSTRING在B.ID每一次执行的时候的值是多少?
FROM tblTest A, # B
WHERE SUBSTRING(',' + a.PdName, B.id, 1) = ',' --这个where后面的检索条件又代表什么含义?
ORDER BY 1,2
GODROP TABLE tblTest, #
即:CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1,'中国;日本;韩国' UNION ALL
SELECT 2,'美国;意大利;法国' UNION ALL
SELECT 3,'德国'
SELECT * FROM A-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b
SELECT
A.ID,
COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX(';', A.COUNTRY + ';', B.ID) - B.ID)
FROM A, # B
WHERE SUBSTRING(';' + a.COUNTRY, B.id, 1) = ';'
ORDER BY 1,2
GODROP TABLE A,#id country
----------- ----------------
1 中国;日本;韩国
2 美国;意大利;法国
3 德国(所影响的行数为 3 行)ID COUNTRY
----------- ---------
1 韩国
1 日本
1 中国
2 法国
2 美国
2 意大利
3 德国(所影响的行数为 7 行)
set @sql=replace(@Ids,',',','''+@IDName+''' union all select ')+','''+@IDName+''''exec('insert IDS(IDS,IDName) select '+@sql )
gocreate procedure sp_test(@str varchar(8000),@IDName varchar(50),@IDLevel int)
as
begin
while charindex(',',@str)>0
begin
insert into IDS(IDS,IDNAME,IDLevel) select left(@str,charindex(',',@str)-1),@IDName,@IDLevel
set @str=stuff(@str,1,charindex(',',@str),'')
end
insert into IDS(IDS,IDNAME,IDLevel) select @str,@IDName,@IDLevel
end
goexec sp_test '1,2,3,4,5,9','Hello',NULLselect * from IDS
/*
IDS IDNAME IDLevel
----------- -------------------------------------------------- -----------
1 Hello NULL
2 Hello NULL
3 Hello NULL
4 Hello NULL
5 Hello NULL
9 Hello NULL
*/
godrop procedure sp_test
drop table IDS
go
CREATE FUNCTION [dbo].[f_splitToTable] (@p_StringList VARCHAR(1000),@flag char(1)=',')
RETURNS @t TABLE (s VARCHAR(10))
AS
BEGIN
DECLARE @ib int,@ie int
set @p_StringList=ltrim(rtrim(@p_StringList))
if left(@p_StringList,1)=@flag set @p_StringList=right(@p_StringList,len(@p_StringList)-1)
if right(@p_StringList,1)<>@flag set @p_StringList=@p_StringList+@flag
select @ib=0,@ie=0
select @ie=charindex(@flag,@p_StringList,@ib+1)
WHILE @ie > 0
BEGIN
insert into @t select substring(@p_StringList,@ib+1,@ie-@ib-1)
select @ib=@ie,@ie=charindex(@flag,@p_StringList,@ib+1)
END
RETURN
END--调用:
select @IDName,s from dbo.f_splitToTable(@IDS,',')
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int = null
)
as
begin
declare @IDSplit varchar(10) --数据分隔符
set @IDSplit = ','
--创建分拆处理的辅助表(用户定义函数中只能操作表变量)
DECLARE @t TABLE(ID int IDENTITY,b bit)
declare @re TABLE(col varchar(10),IDName varchar(50),IDlevel int)
INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b INSERT @re SELECT SUBSTRING(@IDS,ID,CHARINDEX(@IDSplit,@IDS+@IDSplit,ID)-ID),@IDName,@IDLevel
FROM @t
WHERE ID<=LEN(@IDS+'a')
AND CHARINDEX(@IDSplit,@IDSplit+@IDS,ID)=ID
select * from @re
END
GO
exec Pro_AddIDS '1,5,9,6,10','hello'
go
drop proc Pro_AddIDS
/*
col IDName IDlevel
---------- -------------------------------------------------- -----------
1 hello NULL
5 hello NULL
9 hello NULL
6 hello NULL
10 hello NULL
*/
CREATE TABLE IDS
(
ID INT,
IDName VARCHAR(50),
IDLevel int
)
godrop table #--存储过程
create PROCEDURE Pro_AddIDS
@IDS varchar(255),
@IDName varchar(50),
@IDLevel intascreate table # (
ids int
)declare @sql varchar(8000)
set @sql=replace(@IDS,',',' union all select ')exec('insert # select '+@sql )insert Ids
select ids,@IDName,@IDLevel from #drop table #go--调用
exec Pro_AddIDS '1,5,9,6,10','hello',null--结果
select * from idsID IDName IDLevel
----------- -------------------------------------------------- -----------
1 hello NULL
5 hello NULL
9 hello NULL
6 hello NULL
10 hello NULL(所影响的行数为 5 行)
SELECT b.s,@IDName
FROM(SELECT CONVERT(xml,'<r><v>'+REPLACE(@IDS,',','</v><v>') + '</v></r>') x) a
OUTER APPLY(SELECT s=N.v.value('.', 'varchar(100)') FROM a.x.nodes('/r/v') N(v)) b
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int
)
as
Set Nocount onSelect Top 500 identity(int,1,1) as ident into #Table_Pqs from syscolumns as pqs,syscolumns as pqhSelect Substring(Pqh.IDS,Pqs.ident,charindex(',',Pqh.IDS+',',Pqs.ident) - Pqs.ident) As [ID],@IDName As IDName ,@IDLevel As IDLevel
from (Select @IDS as IDS) as Pqh,#Table_Pqs as Pqs
Where Substring(','+Pqh.IDS,Pqs.ident,1)=',' drop table #Table_Pqs
go--------------------------------
执行
Pro_AddIDS '1,5,9,6,10','hello',null
--------------------------------
ID IDName IDLevel
--------------------------------
1 hello NULL
5 hello NULL
9 hello NULL
6 hello NULL
10 hello NULL
CREATE TABLE #
(
ID INT,
IDName VARCHAR(50),
IDLevel int
)declare @var nvarchar(4000)set @var='insert into # select '''+ REPLACE ('1,1,1,2,3,4,5',',',''',@IDName,@IDLevel union all select''')+''',@IDName,@IDLevel'execute sp_executesql @var,N'@IDName varchar(50), @IDLevel int',@IDName='hello',@IDLevel=null
select * from #
ID IDName IDLevel
----------- -------------------------------------------------- -----------
1 hello NULL
1 hello NULL
1 hello NULL
2 hello NULL
3 hello NULL
4 hello NULL
5 hello NULL(所影响的行数为 7 行)
(
ID INT,
IDName VARCHAR(50),
IDLevel int
)alter PROCEDURE Pro_AddIDS(
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int
)
as
declare @var nvarchar(4000)
set @var='insert into # select '''+ REPLACE (@IDS,',',''',@IDNames,@IDLevels union all select''')+''',@IDNames,@IDLevels'
execute sp_executesql @var,N'@IDNames varchar(50), @IDLevels int',@IDNames=@IDName,@IDLevels=@IDLevelexec Pro_AddIDS '1,2,54,6,7,43,3','how','1'
select * from #ID IDName IDLevel
----------- -------------------------------------------------- -----------
1 how 1
2 how 1
54 how 1
6 how 1
7 how 1
43 how 1
3 how 1
ps:@IDLevel中数据个数与@IDS中是相等的
exec(@str)
IDS IDName IDLevel
----------- --------------------------------------------------
1 hello 5
5 hello 20
9 hello 300
6 hello 78
10 hello 69
(
ID INT,
IDName VARCHAR(50),
IDLevel int
)
Go
---创建存储过程
Create Proc Sp_TestSplit
@IDS Varchar(1000),
@IDName Varchar(1000),
@IDLevel Varchar(1000)
As
Begin
While CharIndex(',',@IDS)>0 Or CharIndex(',',@IDLevel)>0
Begin
Insert IDS Select Left(@IDS,CharIndex(',',@IDS)-1),@IDName,
Left(@IDLevel,CharIndex(',',@IDLevel)-1)
Set @IDS=Stuff(@IDS,1,CharIndex(',',@IDS),'')
Set @IDLevel=Stuff(@IDLevel,1,CharIndex(',',@IDLevel),'')
End
Insert IDS Select @IDS,@IDName,@IDLevel
End
GO
----调用存储过程
Exec SP_TestSplit "1,5,9,6,10","hello","5,20,300,78,69"----查询
Select * From IDS
----结果
/*
IDS IDName IDLevel
----------- -------------------- --------------------
1 hello 5
5 hello 20
9 hello 300
6 hello 78
10 hello 69(所影响的行数为 5 行)
*/
CREATE TABLE IDS
(
ID INT,
IDName VARCHAR(50),
IDLevel int
)go---创建存储过程
CREATE PROCEDURE Pro_AddIDS(
@IDS varchar(255),
@IDName varchar(50),
@IDLevel int
)
as
begin
declare @str varchar(8000),@str1 varchar(8000)
if isnull(@IDName,'')=''
set @str1='null'
else
set @str1=''''+@IDName+''''
set @str='insert IDS([id]) select '+replace(isnull(@IDS,''),',',' union all select ')+ ' go update IDS set IDName='+@str1+',IDLevel='+isnull(rtrim(@IDLevel),'null')+' where ID in('+@IDS+')'
exec(@str)
endgo -----执行存储过程
exec Pro_AddIDS '1,2,3,4,5,9','HELLO',NULL---查看纪录
select * from ids---删除表和存储过程
drop table ids
drop proc Pro_AddIDS