當前位置:首頁 » 編程語言 » 文本數據分列的sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

文本數據分列的sql

發布時間: 2022-08-07 09:42:47

sql 如何分列

先導出成文本文件,再導成資料庫

Ⅱ SQL 中如何分列

我來回答吧,下面代碼我測試過,完全運行無誤,而且效率非常高。
你先創建一個 sql函數 ,日期格式轉換 如:12-01-09 為 09-01-12
然後在更新 資料庫。

詳細代碼如下:
go
create function ConvertDateStr(@str varchar(10))
returns varchar(10)
as
begin
-- 12-01-09
declare @d varchar(2),@m varchar(2),@y varchar(4)
set @d = left(@str,2)

set @str = substring(@str,4,len(@str))
set @m = left(@str,2)
set @str = substring(@str,4,len(@str))
set @y = @str
return @y + '-'+ @m + '-' + @d
end

go

-- select dbo.ConvertDateStr('12-01-09')

update 你的表 set 要轉換列 = dbo.ConvertDateStr(要轉換列)

Ⅲ sql 將一個欄位的數據分列顯示

SQL2000不支持開窗函數row_number() ,實現這種效果可以藉助存儲過程。

CREATE PROCEDURE 存儲過程2
AS
set nocount on
/* 創建一個臨時表,利用identity 添加一個從1開始的連續標識列 */
/* x欄位我設置為變長字元串型,請更改為與原始欄位類型相同 */
create table #temp (id int identity,X varchar(50))
/* 將原始表中數據插入臨時表 */
insert into #temp(x) select colName from tableName order by colName
/* 輸出希望得到列表效果 */
/* 思路:id除4求模數根據結果將X值分別放到欄位a,b,c */
/* 用(case id%4 when 1 then id + 3 when 2 then id +2 when 3 then id +1 else id end)將每4條記錄標識為一組 */
/* 最後通過求分組最大值得辦法得到最終列表 */
select
max(case (case id%4 when 1 then 1 when 2 then 2 when 3 then 3 else 0 end) when 1 then x else null end) as a,
max(case (case id%4 when 1 then 1 when 2 then 2 when 3 then 3 else 0 end) when 2 then x else null end) as b,
max(case (case id%4 when 1 then 1 when 2 then 2 when 3 then 3 else 0 end) when 3 then x else null end) as c,
max(case (case id%4 when 1 then 1 when 2 then 2 when 3 then 3 else 0 end) when 0 then x else null end) as d
from #temp
group by (case id%4 when 1 then id + 3 when 2 then id +2 when 3 then id +1 else id end)
set nocount off

上面代碼源自下面存儲過程,相對容易理解,但是由於過程里使用多一次操作查詢(update)其效率也許會慢一些(但是本人未證實)

CREATE PROCEDURE 存儲過程1
AS
set nocount on
create table #temp (id int identity,X nvarchar(50),idd int, flag smallint)
insert into #temp(x) select colName from tableName order by colName
update #temp set flag=case id%4 when 1 then 1 when 2 then 2 when 3 then 3 else 0 end,
idd=case id%4 when 1 then id + 3 when 2 then id +2 when 3 then id +1 else id end
select
max(case flag when 1 then x else null end) as a,
max(case flag when 2 then x else null end) as b,
max(case flag when 3 then x else null end) as c,
max(case flag when 0 then x else null end) as d
from #temp group by idd
set nocount off

Ⅳ sql 如何批量分列

你參考下:

--模擬數據
create table #yourtable(ID int,Content varchar(4000))
insert into #yourtable(ID,Content)
select 1,'22|5000|3000'
union all select 2,'1|35|200|2'
union all select 3,'802|22'
union all select 4,'213|354|2002|22|500'

--實際操作SQL
declare @sql nvarchar(4000),@i int
set @i=1
while exists(select 1 from #yourtable where Content<>'')
begin
set @sql='alter table #yourtable add Data'+convert(varchar,@i)+' int'
exec(@sql)
set @sql='declare @loc int update #yourtable set @loc=charindex(''|'',Content),Data'
+convert(varchar,@i)+'=convert(int,case @loc when 0 then Content else '
+'substring(Content,1,@loc-1) end),Content=case @loc when 0 then '''' else '
+'substring(Content,@loc+1,len(Content)-@loc) end where Content<>'''''
exec(@sql)
set @i=@i+1
end
select * from #yourtable

--刪除演示數據
drop table #yourtable

--結果
ID Data1 Data2 Data3 Data4 Data5
----------- ----------- ----------- ----------- ----------- -----------
1 22 5000 3000 NULL NULL
2 1 35 200 2 NULL
3 802 22 NULL NULL NULL
4 213 354 2002 22 500

Ⅳ SQL根據欄位內容進行分列,sql語句怎麼寫

這種不好弄。。
--
select id,replace(col,'2015-','|2015-') from table_name;
用得到的這個結果,根據|這個分隔符重新導入一個新表,之後就好弄了

Ⅵ SQL 如何分列

declare @表1 table (id int,數據 varchar(10))
insert into @表1
select 1,'a b c' union all
select 2,'c a n' union all
select 3,'s c v'

select id,數據1=parsename(replace(數據,' ','.'),3),
數據2=parsename(replace(數據,' ','.'),2),
數據3=parsename(replace(數據,' ','.'),1) from @表1
/*
id 數據1 數據2 數據3
------------------
1 a b c
2 c a n
3 s c v
*/

Ⅶ sql中分列問題

id 代表要分列的列
思想:先求出','的個數——〉(len(id)-len(replace(id,',','')))
在使用substring進行分割
有點麻煩,逗號再多的時候,後面還要繼續判斷,僅此舉例,敬請收下!
select case when(len(id)-len(replace(id,',',''))) = 0 then substring(id,1,len(id))
when(len(id)-len(replace(id,',',''))) <> 0 then substring(id,1,CHARINDEX(',',id)-1)
end as a,
case when (len(id)-len(replace(id,',',''))) = 1 then substring(id,CHARINDEX(',',id)+1,len(id)-CHARINDEX(',',id))
when (len(id)-len(replace(id,',',''))) = 2 then
substring((substring(id,CHARINDEX(',',id)+1,len(id)-CHARINDEX(',',id))),1,CHARINDEX(',',(substring(id,CHARINDEX(',',id)+1,len(id)-CHARINDEX(',',id))))-1)
end as b,
case when (len(id)-len(replace(id,',',''))) = 2 then substring((substring(id,CHARINDEX(',',id)+1,len(id)-CHARINDEX(',',id))),CHARINDEX(',',(substring(id,CHARINDEX(',',id)+1,len(id)-CHARINDEX(',',id))))+1,len((substring(id,CHARINDEX(',',id)+1,len(id)-CHARINDEX(',',id))))-CHARINDEX(',',(substring(id,CHARINDEX(',',id)+1,len(id)-CHARINDEX(',',id)))))
end as c
from table_1

Ⅷ 求一條sql語句,把資料庫表中一個欄位裡面的數據數字和文字都分開,並且生成一個相對應的列

2 命名規則
2.1 表名
XXX相關表以r_作為前綴,YYY相關表以t_作為前綴。如r_acc 、t_bcc。
後台表名盡量與前台表名相同,後台獨有的表應以_b作為後綴。如r_gggd_b。
命名應盡量反映存儲的數據內容。
2.2 視圖名
視圖以v_作為前綴。由於前台無視圖,故不需加_b。
命名應盡量體現各視圖的功能。
2.3 觸發器名
觸發器名為相應的表名加上後綴,Insert觸發器加'_i',Delete觸發器加'_d',Update觸發器加'_u',如:r_bch_i,r_bch_d,r_bch_u。
2.4 存儲過程名
存儲過程應以'sp_'開頭,後續部分主要以動賓形式構成,並用下劃線分割各個組成部分。如增加BSC機架的DRT單板的存儲過程為'sp_ins_board_drt'。
2.5 變數名
變數名採用小寫,若屬於片語形式,用下劃線分隔每個單詞,如@my_err_no。
2.6 命名中其他注意事項
以上命名都不得超過30個字元的系統限制。
變數名的長度限制為29(不包括標識字元@)。
數據對象、變數的命名都採用英文字元。禁止使用中文命名。

3 編程結構和描述
SQL SERVER系統中,一個批處理是從客戶傳給伺服器的一個完整的包,可以包含若干條SQL語句。批處理中的語句是作為一組去進行語法分析、編譯和執行的。觸發器、存儲過程等數據對象則是將批處理永久化的方法。
3.1 注釋
注釋可以包含在批處理中。在觸發器、存儲過程中包含描述性注釋將大大增加文本的可讀性和可維護性。本規范建議:
1、 注釋以英文為主。
實際應用中,發現以中文注釋的SQL語句版本在英文環境中不可用。為避免後續版本執行過程中發生某些異常錯誤,建議使用英文注釋。
2、 注釋盡可能詳細、全面。
創建每一數據對象前,應具體描述該對象的功能和用途。
傳入參數的含義應該有所說明。如果取值范圍確定,也應該一並說明。取值有特定含義的變數(如boolean類型變數),應給出每個值的含義。
3、 注釋語法包含兩種情況:單行注釋、多行注釋
單行注釋:注釋前有兩個連字元(--),最後以行尾序列(CR-LF)結束。一般,對變數、條件子句可以採用該類注釋。
多行注釋:符號/*和*/之間的內容為注釋內容。對某項完整的操作建議使用該類注釋。
4、 注釋簡潔,同時應描述清晰。
3.2 函數注釋:
編寫函數文本--如觸發器、存儲過程以及其他數據對象--時,必須為每個函數增加適當注釋。該注釋以多行注釋為主,主要結構如下:
/************************************************************************
*name : --函數名
*function : --函數功能
*input : --輸入參數
*output : --輸出參數
*author : --作者
*CreateDate : --創建時間
*UpdateDate : --函數更改信息(包括作者、時間、更改內容等)
*************************************************************************/
CREATE PROCEDURE sp_xxx

3.3 條件執行語句if…else
條件語句塊(statenemt block,以 begin…end為邊界)僅在if子句的條件為真時才被執行。為提高代碼的可讀性,建議嵌套不多於5層。還有,當嵌套層次太多時,應該考慮是否可以使用case語句。
3.4 重復執行while和跳轉語句goto
需要多次執行的語句,可以使用while結構。其中,控制while循環的條件在任何處理開始之前需要先執行一次。循環體中的保留字break無條件的退出while循環,然後繼續處理後續語句;保留字continue重新計算while條件,如果條件為真,則從循環開始處重新執行各語句。
使用跳轉語句goto和標簽label也可以方便地實現循環和其他更靈活的操作。SQL SERVER僅具有單通道語法分析器,因此不能解析對尚未創建的對象所做的前向參考。換言之,跳轉到某標簽的後續語句應該是可執行的(如不存在可能尚未創建的數據對象)。
3.5 書寫格式
資料庫伺服器端的觸發器和存儲過程是一類特殊的文本,為方便開發和維護,提高代碼的易讀性和可維護性。規范建議按照分級縮進格式編寫該文本。
順序執行的各命令位於同一級;條件語句塊(statenemt block,以 begin…end為邊界)位於下一級,類推。
SQL語句是該文本的主體。為適應某些教復雜的用戶需求,SQL語句可能比較龐大。為方便閱讀和維護,規范建議按照SQL語句中系統保留字的關鍵程度再劃分為三級。具體分級請參照下表。其中,非系統保留字(如欄位名、數據表名、標點符號)相對本級保留字再縮進一級。多個連續的非保留字可以分行書寫,也可以寫在同一行。當WHERE包含的條件子句教復雜時,應該每行只寫一個條件分句,並為重要的條件字句填寫單行注釋。
在保證基本縮進格式的前提下,可以通過對齊某些重要關鍵字(如條件關鍵字AND、OR,符號 = 、 <> 等)來進一步提高文本的易讀性和可維護性。
相鄰兩級的縮進量為10個空格。這也是ISQL編輯器默認的文本縮進量。另外,在ISQL編輯器中,一個TAB鍵也相當於10個空格。

註:按照功能,四類SQL語句(SELECT、INSERT、UPDATE、DELETE)的關鍵字可以劃分為三類:主關鍵字、次關鍵字、一般關鍵字。如下表所示:
主關鍵字 次關鍵字 一般關鍵字
SELECTINSERT (INTO)UPDATEDELETE FROMWHEREVALUESINSERT…SELECT…FROM語句中的SELECT和FROM ANDORBETWEENINLIKE

3.6 字體
系統保留字應大寫,包括系統公共變數等。其他字元(如用戶自定義變數、用戶自定義數據對象名)小寫。
需要特殊強調的部分可以大寫。
一條完整注釋語句的首字元應大寫。對某變數、某條件字句的注釋可以全部使用小寫。

通過下一節中生成表r_a的刪除觸發器的實例可以部分說明對象命名、注釋、基本書寫格式和字元大小寫方面的一些注意事項。

4 觸發器編程規范
4.1 範例
下面通過一個例子,說明觸發器編程中應遵守的規范:

/* delete related r_a according to deleted table */
CREATE TRIGGER r_a_d ON r_a
FOR DELETE
AS
IF @@ROWCOUNT = 0 -no rows deleted
RETURN

/* delete r_b table related to deleted table */
DELETE r_b
FROM r_b b, deleted d
WHERE b.id=d.id

IF @@ERROR != 0
BEGIN
RAISERROR("Error occurred deleting related records", 16, 1)
ROLLBACK TRAN
END

RETURN

作以下幾點說明:
1. 檢查是否有行被修改。注意:不論數據是否被修改,觸發器都會引發,執行情況取決於T-SQL語句的執行,而和任何潛在的where子句是否執行無關。
2. 因為被刪除行在該表中不再可用,所以應在被刪除的表中查看。
3. 檢查T-SQL語句的返回代碼,以捕獲任何出錯條件。
4.2 事務過程中的觸發器
1. 觸發器內的rollback將所有工作返回至最外層的begin tran,完成觸發器內的處理並異常終止當前的批處理。
2. 不可以從觸發器內部返回至某個已命名的事務過程,這將產生運行錯誤,掛起所有工作並終止批處理。
5 存儲過程編程規范
5.1 帶有參數的執行
在執行存儲過程時,可以通過名字來制定參數,這樣可以用任何順序傳遞參數,而且自動起到注釋的作用,因此建議編程時使用這種方法。
5.2 預設參數值
把參數的預設值定為null,這是捕獲在過程內調用存儲過程所產生的錯誤的常用方法,不應讓標准伺服器消息報告參數丟失。在給定預設之後,可以校驗該預設值並在存儲過程內採取措施。
注意,當附值SELECT語句不返回行時,局部變數將保持在SELECT語句執行之前所具有的值。建議使用系統提供的某些全局變數(如@@ROWCOUNT)檢測SELECT返回的結果。
5.3 返回值
每個存儲過程自動返回一個整數型的狀態值:成功完成時返回0,而返回-1~-99表示SQL Server檢測到了錯誤。以下為SQL Server系統常用的返回狀態碼:
值 含義
0 Procere was executed successfully
?-1 Object missing
?-2 Datatype error occurred
?-3 Process was chosen as deadlock victim
? -4 Permission error occurred
?-5 Syntax error occurred
? -6 Miscellaneous user error occurred
?-7 Resource error, such as out of space, occurred
? -8 Non-fatal internal problem encountered
?-9 System limit was reached
??-10 Fatal internal inconsistency occurred
??-11 Fatal internal inconsistency occurred
??-12 Table or index is corrupt
??-13 Database is corrupt
?-14 Hardware error occurred
在程序中,用return語句可指定大於0或小於-99的返回值,調用程序可以設置局部變數接收和檢查返回狀態。
5.4 存儲過程和事務處理
如果事務處理在存儲過程返回時的嵌套層次與執行時的層次不同,SQL Server會顯示信息提示事務處理嵌套失控。因為存儲過程並不異常終止該批處理,在執行和確認隨後的語句時,過程內的rollback tran 會導致數據完整性損失。
在編寫存儲過程時,應遵守以下原則:
1. 過程對@@trancount應無凈改變。
2. 僅當存儲過程發出begin tran語句時,才發出rollback tran。
5.5 其他注意事項
存儲過程應該堅實可靠的,因為它們是駐留在伺服器中,被頻繁使用的。應仔細檢查參數的有效性,並在有問題時返回出錯信息。應確保參數的數據類型和被比較的欄的數據類型匹配,從而避免數據類型匹配錯誤。在每個SQL語句之後要檢查@@error。

6 數據對象的國際化
6.1 關於數據對象的命名
數據對象和變數的命名一律採用英文字元。禁止使用中文命名。其他命名注意事項和規范請參考2命名規則。
6.2 關於RAISERROR
SQL SERVER 系統的RAISERROR命令能夠把某個出錯情況返回給調用過程,這對說明調用過程的執行情況很有必要;同時可以部分避免客戶端的冗餘操作。另外,結合系統存儲過程sp_addmessage和sp_dropmessage可以方便實現數據對象在SQL SERVER端的國際化。
SQL SERVER的MASTER資料庫中有錯誤信息數據表sysmessages,專門用於存儲系