A. sql 2012 一行拆多行
比較簡單
1、首先以【,】為間隔符,拆分每行為多行
2、然後拆分其他行,然後用拆分後的行號和ID進行關聯
這樣就可以實現
B. sql 一行數據改成多行
您的方法(不建視圖):
SELECT TOP 100 PERCENT *
FROM (SELECT *, SUBSTRING(Picture, 32, 30) AS PICTUREV FROM dbo.procts
WHERE (SUBSTRING(Picture, 32, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 63, 30) AS PICTUREV FROM dbo.procts
WHERE (SUBSTRING(PictureB, 63, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 94, 30) AS PICTUREV FROM dbo.procts
WHERE (SUBSTRING(PictureB, 94, 30) <> '')
) DERIVEDTBL
ORDER BY ...
我覺得您的子串應該是這樣計算的,:
SUBSTRING(Picture, 0*31+1,30)
SUBSTRING(Picture, 1*31+1,30)
SUBSTRING(Picture, 2*31+1,30)
SUBSTRING(Picture, 3*31+1,30)
所以,在語句中這樣寫也會更好寫,更容易理解,和更不容易出錯。也不影響效率。
你的方法除了多餘建了那麼多視圖,應該說是不錯的方法了,但是實現不了不等長文件名按分隔符分離字串。
如果是分隔符為字串分段,您就必須要用我的自定義函數加我的語句。
如果是您寫的那樣,是固定長度的字串分段,那麼就完全用你的方法,便是稍作改動,不用建中間視圖
另外,您喜歡視圖的話,可以建一個視圖:
create view DERIVEDTBL
as
create view
SELECT *, SUBSTRING(Picture, 0*31+1,30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(Picture, 32, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 1*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 63, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 2*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 94, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 3*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 94, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 4*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 94, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 5*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 94, 30) <> '')
--....向下任意延伸,只要改SUBSTRING中的序號就行了。
go
調用時這樣就行了:
SELECT TOP N *
FROM DERIVEDTBL
ORDER BY ...
=================
一句解決問題,這樣:
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,1,'|') AS PICTURE,1 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,2,'|') AS PICTURE,2 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,3,'|') AS PICTURE,3 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,4,'|') AS PICTURE,4 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,5,'|') AS PICTURE,5 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,6,'|') AS PICTURE,6 AS SN from TABLENAME
-- . . . . . .
ORDER BY ID,TITLE,SN
還有,您的這個函數求等長字串,不知道為什麼沒有首字串?
SUBSTRING(Picture, 32, 30)
就是這個個?
SUBSTRING(Picture, 1, 30)
===================
這里只給您寫了6行,來滿足您每ID最多6張圖片的要求。寫多少行都可以,即每ID最大圖片數為6張。您可以寫100行,1000行都行!
這里還給您多加了以個序號欄位(SN),以保證圖片順序與原排列相同。如果不需要您可以去掉他。
下面的函數是一個非常有用的自定義數,是用來提取字串中某一部份的,請您執行一下,把他建立到您的資料庫中,今後對您的編程會提供很大的方便。當然,本例所用的函數就是這個函數。
create FUNCTION mysplit--將以某分隔符分段的字串,按指定的順序號提取子串
(@str nvarchar(2000),--源字串
@sn int, --提取序號
@Deli varchar(1) --分隔符
)
RETURNS varchar(100)
AS
BEGIN
declare @first int,@last int,@result varchar(1000),@sn0 int
select @sn0=0,@first=0,@LAST=1,@str=@str+REPLICATE(@DELI,1)
while @sn0!=@sn
begin
select @sn0=@sn0+1,@first=@LAST,@last=charindex(@DELI,@str,@LAST)+1
end
if @last-@first-1<0
set @result=''
else
SET @RESULT=SUBSTRING(@str,@FIRST,@LAST-@FIRST-1)
RETURN ( @RESULT )
END
GO
C. SQL資料庫 怎麼將一行數據變成多行
用一個循環。
先用參數取到到底要變成多少行,和單價
declare
@t
int
declare
@sal
nvarchar(8)
根據需求或實際情況將應變為多少行這個烤取給變數@t,單價取給@sal
設置循環的起始數值
declare
@i
int
set
@i=1
開始循環
while(@i<=@t)
begin
--將單行的數據插入需要的表
insert
into(……)
values(……)
--循環參數自增
set
@i=@i+1
end
D. 如何用SQL語句將一行變成多行
如下:
create table T (TICKET_ID VARCHAR(10),
EMP_ID VARCHAR(50),
PRIMARY KEY (TICKET_ID ));
E. SQL資料庫語句如何將一行變多行
用一個循環。
先用參數取到到底要變成多少行,和單價
declare @t int
declare @sal nvarchar(8)
根據需求或實際情況將應變為多少行這個烤取給變數@t,單價取給@sal
設置循環的起始數值
declare @i int
set @i=1
開始循環
while(@i<=@t)
begin
--將單行的數據插入需要的表
insert into(……)
values(……)
--循環參數自增
set @i=@i+1
end
F. 如何用SQL語句將數據一行變成多行呢
截斷數據,在新增分隔符即可。
放大招
指定索引號,進行數據截取,返回處理後的字元串數組
string str =你的數據
str.substring(你想分的長度)你自己列印一個轉換符就好了
G. 請教一個SQL SERVER 一行轉多行的問題
--先建個表值函數,負責字元串拆分
CreateFunction[dbo].[f_split1](@SourceSqlVarchar(8000),@StrSeprateVarchar(2))
Returns@tempTable(idIntIdentity(1,1),colVarchar(100))
As
begin
Declare@chasVarchar(100)
Set@SourceSql=@SourceSql+@StrSeprate
While(@SourceSql<>'')
Begin
Set@ch=left(@SourceSql,Charindex(@StrSeprate,@SourceSql,1)-1)
Insert@temp(col)Values(@ch)
Set@SourceSql=Stuff(@SourceSql,1,Charindex(@StrSeprate,@SourceSql,1),'')
End
Return
End
go
--建表
createtableT
(
idint,
col1varchar(100),
col2varchar(100)
)
go
--插入數據
insertintoTvalues(1,'a;b','1;2')
insertintoTvalues(2,'c;d','3;4')
insertintoTvalues(3,'e;f;4','5;6;4')
--查詢
selectt.id,a.colascol1,b.colascol2fromt
outerapplydbo.f_split1(col1,';')a
outerapplydbo.f_split1(col2,';')b
wherea.id=b.id
H. SQL一行變多行
--很簡單啦,以下在sql2005測試通過,樓主請看:
create table #t(a int,b int,c int,d int)
insert #t
select 1, 2, 3, 4 union all
select 5, 6, 7, 8
select a,b,c,0 as d from #t
union
select a,b,0 as c,d from #t