語法:
DBCC CHECKIDENT(salary_month_others, RESEED, 0)
參考:
DBCC CHECKIDENT (Transact-SQL)
[SQL]MS SQL 自動編號(identity)歸零(reset)
SQL Server 自動編號欄位歸零
ms-sql自動編號(identity)功能歸零的語法
[MSSQL] 重置自動編號(識別計數器)的語法
將辨識欄位(系統自動編號)重新編號
2016年4月5日 星期二
2013年12月12日 星期四
[SQL] 去除欄位中(或左右兩邊)的空白
Q:
在SELECT COUNT(*)時都無法正確取得數量...
故猜測是多了空白...
A:
某A在插入CustomerOrderNo時, 右邊多了N個空白...
Solution Code:
SELECT a.CustomerOrderNo,a.CustomerOrderDate,a.CustomerID,a.CompanyName,(SELECT count(*) FROM [tblT出貨統計資料表] WHERE CustomerOrderNo = replace(a.CustomerOrderNo,' ','')) as Qty
FROM [tblT訂單統計資料表] as a LEFT JOIN [tblODeliveryOrder] as b on a.CustomerOrderNo = b.CustomerOrderNo WHERE b.DeliveryOrderNo = 'PO201210030';
參考:
去除MS SQL欄位中空白
sql字串去除左右空白字元
SQL Trim 函數
在SELECT COUNT(*)時都無法正確取得數量...
故猜測是多了空白...
A:
某A在插入CustomerOrderNo時, 右邊多了N個空白...
Solution Code:
SELECT a.CustomerOrderNo,a.CustomerOrderDate,a.CustomerID,a.CompanyName,(SELECT count(*) FROM [tblT出貨統計資料表] WHERE CustomerOrderNo = replace(a.CustomerOrderNo,' ','')) as Qty
FROM [tblT訂單統計資料表] as a LEFT JOIN [tblODeliveryOrder] as b on a.CustomerOrderNo = b.CustomerOrderNo WHERE b.DeliveryOrderNo = 'PO201210030';
參考:
去除MS SQL欄位中空白
sql字串去除左右空白字元
SQL Trim 函數
2013年8月27日 星期二
[SQL] 不足位數補上零 "0" & 編碼方式[NG-年度-流水號] & 編碼方式[CS年度月份流水號]
編碼方式:
NG-年度-流水號
範例一:
假設目前編號最大號 NG-13-037
SQL:找出最大值+1
SELECT top 1 left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) 報表編號 FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
insert into [瑕疵異狀表] (報表編號) SELECT top 1 left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) 報表編號 FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
結果:
NG-13-038
範例二:
假設今年為 2014 而最大號為 NG-13-038
若是要產生今年的第一筆 NG-14-001
接續產生今年(2014)第二筆 NG-14-002
第N筆 NG-14-N...
SQL:承一更改如下
select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] order by substring(報表編號,4,2) desc,right(報表編號,3) desc; --where 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
insert into [瑕疵異狀表] (報表編號) select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] order by substring(報表編號,4,2) desc,right(報表編號,3) desc; --where 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
結果:
NG-14-001
範例三:承二
當資料有 NG-13-001 ~ n, NG-15-001 ~ n...
藍色因條件在,
調整日期 2013年, 則無法產生 NG-13-(n+1), 而是產出 NG-15-(n+1)
調整日期 2014年, 則正常產生 NG-14-001
調整日期 2016年, 則正常產生 NG-16-001
當資料有 NG-13-001 ~ n, NG-15-001 ~ n...
綠色因條件在,
調整日期 2013年, 則正常產生 NG-13-(n+1)
調整日期 2014年, 則無法產生 NG-14-001
調整日期 2016年, 則無法產生 NG-16-001
當資料有 NG-13-001 ~ n, NG-14-001 ~ n, NG-15-001 ~ n)
藍色因條件在,
調整日期 2013年, 則無法產生 NG-13-(n+1), 而是產出 NG-15-(n+1)
調整日期 2014年, 則無法產生 NG-14-(n+1), 而是產出 NG-15-(n+1)
調整日期 2016年, 則正常產生 NG-16-001
當資料有 NG-13-001 ~ n, NG-15-001 ~ n...
綠色因條件在,
調整日期 2013年, 則正常產生 NG-13-(n+1)
調整日期 2014年, 則正常產生 NG-14-(n+1)
調整日期 2016年, 則無法產生 NG-16-001
SQL:承二更改如下
select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] where substring(報表編號,4,2) <= right(year(getdate()),2) order by substring(報表編號,4,2) desc,right(報表編號,3) desc;
insert into [瑕疵異狀表] (報表編號) select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] where substring(報表編號,4,2) <= right(year(getdate()),2) order by substring(報表編號,4,2) desc,right(報表編號,3) desc;
試試資料依然正確...
NG-13-001 ~ n, NG-15-001 ~ n, NG-17-001 ~ n (無14年及16年的資料)
﹝另一解﹞ CS150210 + 1 = CS150211
:::資料最大值 CS150210 故取出時後二位數+1 = CS150211
:::若該年份該月份無資料列,則CS該年該月001
select top 1 case when (select count(文號) from [DayCsycDB].[dbo].[公文基本資料表]
where 文號 like 'CS'+right(100+year(getdate()),2)+right(100+month(getdate()),2)+'%') =0 then
'CS'+right(100+year(getdate()),2)+right(100+month(getdate()),2)+'01'
else left(文號,6)+convert(nvarchar(2),(right(文號,2)+1)) end 文號
from [DayCsycDB].[dbo].[公文基本資料表]
where 文號 like 'CS'+right(100+year(getdate()),2)+right(100+month(getdate()),2)+'%' ORDER BY Right(文號,2) DESC;
參考:
--select Right(100+month(GetDate()),2)
--select datepart(yyyy,getdate())
--select Right(year(GetDate()),2)
--select REPLICATE('0',4-LEN(substring('123',2,2)))+substring('123',2,2)
--select replicate('0',2)+convert(nvarchar(1),substring('123',3,1)+1)
--select 報表編號 from [瑕疵異狀表] where 報表編號 like '__-' + right(year(getdate()),2) + '-___' order by right(報表編號,3) desc;
--SELECT top 1 報表編號,count(報表編號) FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' group by 報表編號 order by 報表編號 desc;
--SELECT top 1 left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) 報表編號 FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
--select 'CS' + right(right(12303+101,2),2)
--SELECT CASE WHEN MAX(財產電腦單號) IS NULL
[VB.NET] String Format 格式化, 自動補零, 不足位元補零...
Mssql的字符字段如何按位数补零
SQL 字串補0
PLSQL & T-SQL - 字串不足數補零
將不足的位數補零
MS SQL 位數不足補0範例
[Google 搜尋] mssql 位數 補零
SQL函數 查詢SQL資料欄位相符的字串
MSSql 中Charindex ,Substring的使用
CHARINDEX (Transact-SQL)
[MSSQL]取得兩位數的月份或日期
--月
Select Right(100+Month(GetDate()),2)
--日
Select Right(100+Day(GetDate()),2)
Return a value if no rows are found SQL
Return a default value if no rows found
How to Assign a Default Value if No Rows Returned from the Select Query
Getting SELECT to return a constant value even if zero rows match
NG-年度-流水號
範例一:
假設目前編號最大號 NG-13-037
SQL:找出最大值+1
SELECT top 1 left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) 報表編號 FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
insert into [瑕疵異狀表] (報表編號) SELECT top 1 left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) 報表編號 FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
結果:
NG-13-038
範例二:
假設今年為 2014 而最大號為 NG-13-038
若是要產生今年的第一筆 NG-14-001
接續產生今年(2014)第二筆 NG-14-002
第N筆 NG-14-N...
SQL:承一更改如下
select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] order by substring(報表編號,4,2) desc,right(報表編號,3) desc; --where 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
insert into [瑕疵異狀表] (報表編號) select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] order by substring(報表編號,4,2) desc,right(報表編號,3) desc; --where 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
結果:
NG-14-001
範例三:承二
當資料有 NG-13-001 ~ n, NG-15-001 ~ n...
藍色因條件在,
調整日期 2013年, 則無法產生 NG-13-(n+1), 而是產出 NG-15-(n+1)
調整日期 2014年, 則正常產生 NG-14-001
調整日期 2016年, 則正常產生 NG-16-001
當資料有 NG-13-001 ~ n, NG-15-001 ~ n...
綠色因條件在,
調整日期 2013年, 則正常產生 NG-13-(n+1)
調整日期 2014年, 則無法產生 NG-14-001
調整日期 2016年, 則無法產生 NG-16-001
當資料有 NG-13-001 ~ n, NG-14-001 ~ n, NG-15-001 ~ n)
藍色因條件在,
調整日期 2013年, 則無法產生 NG-13-(n+1), 而是產出 NG-15-(n+1)
調整日期 2014年, 則無法產生 NG-14-(n+1), 而是產出 NG-15-(n+1)
調整日期 2016年, 則正常產生 NG-16-001
當資料有 NG-13-001 ~ n, NG-15-001 ~ n...
綠色因條件在,
調整日期 2013年, 則正常產生 NG-13-(n+1)
調整日期 2014年, 則正常產生 NG-14-(n+1)
調整日期 2016年, 則無法產生 NG-16-001
SQL:承二更改如下
select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] where substring(報表編號,4,2) <= right(year(getdate()),2) order by substring(報表編號,4,2) desc,right(報表編號,3) desc;
insert into [瑕疵異狀表] (報表編號) select top 1 case when convert(nvarchar(10),(select count(報表編號) from [瑕疵異狀表] where substring(報表編號,4,2)=right(year(getdate()),2))) = '0' then 'NG-' + right(year(getdate()),2) + '-001' else left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) end 報表編號 from [瑕疵異狀表] where substring(報表編號,4,2) <= right(year(getdate()),2) order by substring(報表編號,4,2) desc,right(報表編號,3) desc;
試試資料依然正確...
NG-13-001 ~ n, NG-15-001 ~ n, NG-17-001 ~ n (無14年及16年的資料)
﹝另一解﹞ CS150210 + 1 = CS150211
:::資料最大值 CS150210 故取出時後二位數+1 = CS150211
:::若該年份該月份無資料列,則CS該年該月001
select top 1 case when (select count(文號) from [DayCsycDB].[dbo].[公文基本資料表]
where 文號 like 'CS'+right(100+year(getdate()),2)+right(100+month(getdate()),2)+'%') =0 then
'CS'+right(100+year(getdate()),2)+right(100+month(getdate()),2)+'01'
else left(文號,6)+convert(nvarchar(2),(right(文號,2)+1)) end 文號
from [DayCsycDB].[dbo].[公文基本資料表]
where 文號 like 'CS'+right(100+year(getdate()),2)+right(100+month(getdate()),2)+'%' ORDER BY Right(文號,2) DESC;
參考:
--select Right(100+month(GetDate()),2)
--select datepart(yyyy,getdate())
--select Right(year(GetDate()),2)
--select REPLICATE('0',4-LEN(substring('123',2,2)))+substring('123',2,2)
--select replicate('0',2)+convert(nvarchar(1),substring('123',3,1)+1)
--select 報表編號 from [瑕疵異狀表] where 報表編號 like '__-' + right(year(getdate()),2) + '-___' order by right(報表編號,3) desc;
--SELECT top 1 報表編號,count(報表編號) FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' group by 報表編號 order by 報表編號 desc;
--SELECT top 1 left(報表編號,6) + replicate('0',3-len(substring(報表編號,7,3)+1))+convert(nvarchar(3),substring(報表編號,7,3)+1) 報表編號 FROM [瑕疵異狀表] WHERE 報表編號 like 'NG-' + Right(year(GetDate()),2) + '-%' ORDER BY 報表編號 DESC;
--select 'CS' + right(right(12303+101,2),2)
--SELECT CASE WHEN MAX(財產電腦單號) IS NULL
THEN 'FA' + right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2) + '001'
ELSE 'FA' + right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2) + replicate('0',3-len(substring(MAX(財產電腦單號),8,3)+1)) + convert(nvarchar(3),substring(MAX(財產電腦單號),8,3)+1) END
FROM C000財產基本資料表Tmp
--WHERE substring(財產電腦單號,3,5) <= right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2)
--SELECT CASE WHEN MAX(財產電腦單號) IS NULL
THEN 'FA' + right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2) + '001'
ELSE 'FA' + right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2) + replicate('0',3-len(substring(MAX(財產電腦單號),8,3)+1)) + convert(nvarchar(3),substring(MAX(財產電腦單號),8,3)+1) END
FROM C000財產基本資料表
WHERE substring(財產電腦單號,3,5) <= right(year(getdate())-1911,3) + RIGHT(REPLICATE('0', 2) + CAST(month(getdate()) as NVARCHAR), 2)
Mssql的字符字段如何按位数补零
SQL 字串補0
PLSQL & T-SQL - 字串不足數補零
將不足的位數補零
MS SQL 位數不足補0範例
[Google 搜尋] mssql 位數 補零
SQL函數 查詢SQL資料欄位相符的字串
MSSql 中Charindex ,Substring的使用
CHARINDEX (Transact-SQL)
[MSSQL]取得兩位數的月份或日期
--月
Select Right(100+Month(GetDate()),2)
--日
Select Right(100+Day(GetDate()),2)
Return a value if no rows are found SQL
Return a default value if no rows found
How to Assign a Default Value if No Rows Returned from the Select Query
Getting SELECT to return a constant value even if zero rows match
2013年8月7日 星期三
[SQL] 簡體字存入資料庫之亂碼解決方式
環境:
WinXP(繁體)
SQL Server 2005(繁體)
目的:
讓簡體字存入資料庫而不變為亂碼[?]
解決:
1)
在 VB.Net 中使用 StrConv 函數進行繁簡字體轉換
將USER輸入的簡體字轉為繁體字存入資料庫
而在應用程式顯示資料時再由簡體字轉為繁體字
2)
MSSQL 簡體字存入亂碼解決方式
資料庫型態須定義為 ntext 或是 nchar , nvarchar
若定義成一般習慣前面未加 'n' 將只能放本國語系的文字
如果簡體字存入就會變成 '?'
而當 Insert 或是 UPDATE 資料時直接將簡體資料寫入也會變成 '?'
寫法必須改為 INSERT INTO table_name(test) VALUES(N'测试')
在寫入的資料前要加 N 他在存入資料庫時才會去呼掉到擴充字集..
如未加 N 他則是使用 big-5 字集...如果使用 .Net 裡面的 DataApdater 來
Update 資料也要注意 Parameters 裡面的關於每個參數的型態設定..
不然也會造成 '?' 的情形發生...................
參考:
參考:C#
How can I rename a file in C#?
C# 繁簡轉換效能大車拚
[C#]繁簡轉換好用的類別庫-Microsoft Visual Studio International Pack
簡繁轉換
簡繁轉換
簡中定序:Chinese_PRC_Stroke_CI_AS
WinXP(繁體)
SQL Server 2005(繁體)
目的:
讓簡體字存入資料庫而不變為亂碼[?]
解決:
1)
在 VB.Net 中使用 StrConv 函數進行繁簡字體轉換
將USER輸入的簡體字轉為繁體字存入資料庫
而在應用程式顯示資料時再由簡體字轉為繁體字
2)
MSSQL 簡體字存入亂碼解決方式
資料庫型態須定義為 ntext 或是 nchar , nvarchar
若定義成一般習慣前面未加 'n' 將只能放本國語系的文字
如果簡體字存入就會變成 '?'
而當 Insert 或是 UPDATE 資料時直接將簡體資料寫入也會變成 '?'
寫法必須改為 INSERT INTO table_name(test) VALUES(N'测试')
在寫入的資料前要加 N 他在存入資料庫時才會去呼掉到擴充字集..
如未加 N 他則是使用 big-5 字集...如果使用 .Net 裡面的 DataApdater 來
Update 資料也要注意 Parameters 裡面的關於每個參數的型態設定..
不然也會造成 '?' 的情形發生...................
參考:
[C#] 簡體亂碼轉換
項目之繁簡體亂碼解決方法
注意:在SQL SERVER中使用NChar、NVarchar和NText
詢問SQL SERVER存放不同資料庫語系的問題
繁簡體寫入資料庫(Tomcat+MSSQL)
台灣本機瀏覽簡體正常,大陸瀏覽簡體亂碼
簡體字是否可以存於繁體版的SQL SERVER呢!?
MSSQL的数据库怎么把其中表和数据从简体转换成繁体(UTF8或BIG5)
linux php freetds mssql 2008 簡體 繁體 共存 採用 UTF-8
【叶子函数分享三十】SQL简繁转换函数
[DEBUG] IIS(FTP)伺服器(繁體XP系統),無法上傳簡體檔案之解決!
[中文編碼問題] 繁體,簡體中文字都可以輸入, 儲存(SQL Server)並顯示在PHP網頁上 (尚無正確的方法)
項目之繁簡體亂碼解決方法
注意:在SQL SERVER中使用NChar、NVarchar和NText
詢問SQL SERVER存放不同資料庫語系的問題
繁簡體寫入資料庫(Tomcat+MSSQL)
台灣本機瀏覽簡體正常,大陸瀏覽簡體亂碼
簡體字是否可以存於繁體版的SQL SERVER呢!?
MSSQL的数据库怎么把其中表和数据从简体转换成繁体(UTF8或BIG5)
linux php freetds mssql 2008 簡體 繁體 共存 採用 UTF-8
【叶子函数分享三十】SQL简繁转换函数
[DEBUG] IIS(FTP)伺服器(繁體XP系統),無法上傳簡體檔案之解決!
[中文編碼問題] 繁體,簡體中文字都可以輸入, 儲存(SQL Server)並顯示在PHP網頁上 (尚無正確的方法)
SQL Server原來是不支援UTF-8的,直到SQL Server 2019才支援
參考:(定序)
SQL Server 資料庫定序問題
筆記:Sql Server 定序 (MSSQL, PHP, 亂碼)
SQL SERVER 简体与繁体 定序 轉換
SQL Server数据库简体繁体数据混用的问题
SQL Server 資料庫定序問題
筆記:Sql Server 定序 (MSSQL, PHP, 亂碼)
SQL SERVER 简体与繁体 定序 轉換
SQL Server数据库简体繁体数据混用的问题
為什會需要將nvarchar轉varchar呢!因為在作SQL與DB2的轉換,DB2那邊都是varchar的!
參考:C#
How can I rename a file in C#?
C# 繁簡轉換效能大車拚
[C#]繁簡轉換好用的類別庫-Microsoft Visual Studio International Pack
簡繁轉換
簡繁轉換
簡中定序:Chinese_PRC_Stroke_CI_AS
繁中定序:Chinese_Taiwan_Stroke_CI_AS
[SQL] 取得資料表Table的欄位數量
select count(*) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'table_name'
select count(*) from information_schema.columns where table_schema='資料庫名稱' and table_name='Table名稱';
參考:
請問怎麼抓回table的欄位數??
請問我要如何計算一個 table 裡的欄位數量
請問怎麼抓回table的欄位數??
取得資料庫「資料表數」、「資料表名稱」,「資料表內欄位名稱」、「欄位數量」
select count(*) from information_schema.columns where table_schema='資料庫名稱' and table_name='Table名稱';
參考:
請問怎麼抓回table的欄位數??
請問我要如何計算一個 table 裡的欄位數量
請問怎麼抓回table的欄位數??
取得資料庫「資料表數」、「資料表名稱」,「資料表內欄位名稱」、「欄位數量」
2013年4月2日 星期二
[SQL] 一次更新多筆資料列 SqlServer2005 & SqlServer 2008
Table:
SQL:
sqlQuery = "UPDATE [attend] SET " & _
" hr = case type when '事假' then @hr事 " & _
"when '病假' then @hr病 when '加班' then 0 when '遲到' then @hr遲 End, " & _
" hrY = case type when '事假' then @hrY事 " & _
"when '病假' then @hrY病 when '加班' then @hrY加 when '遲到' then 0 End, " & _
" times = case type when '事假' then 0 " & _
"when '病假' then 0 when '加班' then 0 when '遲到' then 0 End, " & _
" timesY = case type when '事假' then 0 " & _
"when '病假' then 0 when '加班' then @timesY加 when '遲到' then @timesY遲 End, " & _
" times730 = case type when '事假' then 0 " & _
"when '病假' then 0 when '加班' then @times730加 when '遲到' then 0 End, " & _
"modifyDate=@ModifyDate,modifyUserName=@ModifyUserName," & _
"modifyUserID=@ModifyUserID,SysModifyDate=@SystemModifyDate " & _
"WHERE type in ('事假','病假','加班','遲到') AND ym = @ym AND staff_sn = @staff_sn;"
參考:
[SQL]INSERT & UPDATE multiple records
SQL 同一資料表中,大量更新?
如何一次更新同的欄位的多筆資料
一次更新多筆資料
一次新增多筆資料列 SqlServer2005 & SqlServer 2008
[SQL]將表格橫向呈現
SQL:
sqlQuery = "UPDATE [attend] SET " & _
" hr = case type when '事假' then @hr事 " & _
"when '病假' then @hr病 when '加班' then 0 when '遲到' then @hr遲 End, " & _
" hrY = case type when '事假' then @hrY事 " & _
"when '病假' then @hrY病 when '加班' then @hrY加 when '遲到' then 0 End, " & _
" times = case type when '事假' then 0 " & _
"when '病假' then 0 when '加班' then 0 when '遲到' then 0 End, " & _
" timesY = case type when '事假' then 0 " & _
"when '病假' then 0 when '加班' then @timesY加 when '遲到' then @timesY遲 End, " & _
" times730 = case type when '事假' then 0 " & _
"when '病假' then 0 when '加班' then @times730加 when '遲到' then 0 End, " & _
"modifyDate=@ModifyDate,modifyUserName=@ModifyUserName," & _
"modifyUserID=@ModifyUserID,SysModifyDate=@SystemModifyDate " & _
"WHERE type in ('事假','病假','加班','遲到') AND ym = @ym AND staff_sn = @staff_sn;"
參考:
[SQL]INSERT & UPDATE multiple records
SQL 同一資料表中,大量更新?
如何一次更新同的欄位的多筆資料
一次更新多筆資料
一次新增多筆資料列 SqlServer2005 & SqlServer 2008
[SQL]將表格橫向呈現
2013年4月1日 星期一
[SQL] 一次新增多筆資料列 SqlServer2005 & SqlServer 2008
2005用法:
Previous method 1:
CODE:
sqlQuery = "INSERT into [attend] " & _
"SELECT @staff_sn ,@ym,'事假',@hr事,'0',@hrY事,'0','0', @CreateDate, @CreateUserID,@CreateUserName,@ModifyDate," & _
"@ModifyUserID, @ModifyUserName, @SystemModifyDate" & _
" UNION ALL " & _
"SELECT @staff_sn ,@ym,'病假',@hr病,'0',@hrY病,'0','0', @CreateDate, @CreateUserID,@CreateUserName,@ModifyDate," & _
"@ModifyUserID, @ModifyUserName, @SystemModifyDate" & _
" UNION ALL " & _
"SELECT @staff_sn ,@ym,'加班',0,'0',@hrY加,@timesY加,@times730加, @CreateDate, @CreateUserID,@CreateUserName,@ModifyDate," & _
"@ModifyUserID, @ModifyUserName, @SystemModifyDate" & _
" UNION ALL " & _
"SELECT @staff_sn ,@ym,'遲到',@hr遲,'0','0',@timesY遲,'0', @CreateDate, @CreateUserID,@CreateUserName,@ModifyDate," & _
"@ModifyUserID, @ModifyUserName, @SystemModifyDate;"
參考:
SQL Insert Into
SQL UNION
INSERT多筆資料
SQL SERVER – 2008 – Insert Multiple Records Using One Insert Statement – Use of Row Constructor
[MS SQL] [SQL]利用UNION ALL整合統計合併資料
一次更新多筆資料列 SqlServer2005 & SqlServer 2008
Previous method 1:
USE YourDB
GOINSERT INTO MyTable (FirstCol, SecondCol)VALUES ('First',1);INSERT INTO MyTable (FirstCol, SecondCol)VALUES ('Second',2);INSERT INTO MyTable (FirstCol, SecondCol)VALUES ('Third',3);INSERT INTO MyTable (FirstCol, SecondCol)VALUES ('Fourth',4);INSERT INTO MyTable (FirstCol, SecondCol)VALUES ('Fifth',5);GO
Previous method 2:USE YourDB
GOINSERT INTO MyTable (FirstCol, SecondCol)SELECT 'First' ,1UNION ALLSELECT 'Second' ,2UNION ALLSELECT 'Third' ,3UNION ALLSELECT 'Fourth' ,4UNION ALLSELECT 'Fifth' ,5
GOCODE:
sqlQuery = "INSERT into [attend] " & _
"SELECT @staff_sn ,@ym,'事假',@hr事,'0',@hrY事,'0','0', @CreateDate, @CreateUserID,@CreateUserName,@ModifyDate," & _
"@ModifyUserID, @ModifyUserName, @SystemModifyDate" & _
" UNION ALL " & _
"SELECT @staff_sn ,@ym,'病假',@hr病,'0',@hrY病,'0','0', @CreateDate, @CreateUserID,@CreateUserName,@ModifyDate," & _
"@ModifyUserID, @ModifyUserName, @SystemModifyDate" & _
" UNION ALL " & _
"SELECT @staff_sn ,@ym,'加班',0,'0',@hrY加,@timesY加,@times730加, @CreateDate, @CreateUserID,@CreateUserName,@ModifyDate," & _
"@ModifyUserID, @ModifyUserName, @SystemModifyDate" & _
" UNION ALL " & _
"SELECT @staff_sn ,@ym,'遲到',@hr遲,'0','0',@timesY遲,'0', @CreateDate, @CreateUserID,@CreateUserName,@ModifyDate," & _
"@ModifyUserID, @ModifyUserName, @SystemModifyDate;"
參考:
SQL Insert Into
SQL UNION
INSERT多筆資料
SQL SERVER – 2008 – Insert Multiple Records Using One Insert Statement – Use of Row Constructor
[MS SQL] [SQL]利用UNION ALL整合統計合併資料
一次更新多筆資料列 SqlServer2005 & SqlServer 2008
2013年3月12日 星期二
[SQL] 字串切割與截取
資料庫資料[tb1]: (location 沒有 atomic)
----------------------------------------
欄位名稱 Location
----------------------------------------
欄位內容 Seattle, WA
Natchez, MS
Las Vegas, NV
Palo Alto, CA
NYC, NY
----------------------------------------
問題:
只想取右邊兩位數簡碼。
方法:
SELECT RIGHT(Location, 2) FROM [tb1];
SELECT SUBSTRING_INDEX(Location, ',', 1) FROM [tb1];
參考:
[書籍]HEAD FIRST SQL
使用SQL語法分割字串問題 目前ms-sql應該沒有字串分割的函數
字串函數 (Transact-SQL)
寫 SQL 的邏輯/技巧:字串切割
sql server中如何切割字串
分割字串 (Split)
SQL字串切割
切割字串另類方法
字串分割後轉成Table
SQL-切割字串
字串分割 / String.Split
SQL函數 查詢SQL資料欄位相符的字串
MSSql 中Charindex ,Substring的使用
CHARINDEX (Transact-SQL)
----------------------------------------
欄位名稱 Location
----------------------------------------
欄位內容 Seattle, WA
Natchez, MS
Las Vegas, NV
Palo Alto, CA
NYC, NY
----------------------------------------
問題:
只想取右邊兩位數簡碼。
方法:
SELECT RIGHT(Location, 2) FROM [tb1];
SELECT SUBSTRING_INDEX(Location, ',', 1) FROM [tb1];
參考:
[書籍]HEAD FIRST SQL
使用SQL語法分割字串問題 目前ms-sql應該沒有字串分割的函數
字串函數 (Transact-SQL)
寫 SQL 的邏輯/技巧:字串切割
sql server中如何切割字串
分割字串 (Split)
SQL字串切割
切割字串另類方法
字串分割後轉成Table
SQL-切割字串
字串分割 / String.Split
SQL函數 查詢SQL資料欄位相符的字串
MSSql 中Charindex ,Substring的使用
CHARINDEX (Transact-SQL)
2013年1月28日 星期一
[SQL] UPDATE + SELECT 避免 Race Condition & 兩table多筆更新
即然有 insert 與 select 的結合
當然也有 update 與 select 的結合
UPDATE
tblA
SET
上年同期內銷 = B.內銷合計,
上年同期外銷 = B.外銷台幣,
外銷上年同期美國 = B.外銷美國,
外銷上年同期日本 = B.外銷日本,
外銷上年同期其他 = B.外銷其他,
外銷上年同期重量 = B.外銷重量
FROM tblA AS A
INNER JOIN
(SELECT '2019' 年度,月份,ISNULL(內銷合計,0) 內銷合計,ISNULL(外銷台幣,0) 外銷台幣,ISNULL(外銷美國,0) 外銷美國,ISNULL(外銷日本,0) 外銷日本,ISNULL(外銷其他,0) 外銷其他,ISNULL(外銷重量,0) 外銷重量 FROM tblB where 年度='2018') AS B
ON A.年度 = B.年度 and A.月份=B.月份
WHERE
A.年度 = '2019'
另一篇:
INSERT & SELECT
UPDATE
tblA
SET
上年同期內銷 = B.內銷合計,
上年同期外銷 = B.外銷台幣,
外銷上年同期美國 = B.外銷美國,
外銷上年同期日本 = B.外銷日本,
外銷上年同期其他 = B.外銷其他,
外銷上年同期重量 = B.外銷重量
FROM tblA AS A
INNER JOIN
(SELECT '2019' 年度,月份,ISNULL(內銷合計,0) 內銷合計,ISNULL(外銷台幣,0) 外銷台幣,ISNULL(外銷美國,0) 外銷美國,ISNULL(外銷日本,0) 外銷日本,ISNULL(外銷其他,0) 外銷其他,ISNULL(外銷重量,0) 外銷重量 FROM tblB where 年度='2018') AS B
ON A.年度 = B.年度 and A.月份=B.月份
WHERE
A.年度 = '2019'
另一篇:
INSERT & SELECT
參考:
藍色小惡魔討論區: SQL
用 SELECT ... FOR UPDATE 避免 Race condition藍色小惡魔討論區: SQL
2013年1月23日 星期三
[SQL] 流水號(自動編號), 補上缺號...
問題:
ex: 流水序號(限integer編碼)
0 1 2 5 6 8 12 下一次 補上 3(最小號缺號) or 補上 11(最大號缺號)
0 1 2 3 4 5 最大(或最小) 都會補6
解決:
找出缺號中的最大值
select max(staff_sn-1) as lostnum from employee where (not ((staff_sn-1) in (select staff_sn from employee)))
select max(序號)-1 from [A010詢價單資料表-備註] a
where not exists(select 1 from [A010詢價單資料表-備註] where 序號=a.序號-1 and 詢價單號 = 'AA01') and 詢價單號 = 'AA01';
select top 1 t1.序號-1 from [A010詢價單資料表-備註] t1
where not exists ( select 1 from [A010詢價單資料表-備註] t2 where t2.序號 = t1.序號 -1 and t2.詢價單號 = 'AA01' ) and t1. 詢價單號 = 'AA01'
order by t1.序號 DESC
注意:(有待改進)
若是 5 6 7 則補號為 4 而不是 8 -- 序號間無缺號
若是 1 2 3 則補號為 0
若是 0 1 2 則補號為 -1
-------------------------------
找出缺號中的最小值
select min(staff_sn+1) as lostnum from employee where (not ((staff_sn+1) in (select staff_sn from employee)))
select max(序號)+1 from [A010詢價單資料表-備註] a
where not exists(select 1 from [A010詢價單資料表-備註] where 序號=a.序號+1 and 詢價單號 = 'AA01') and 詢價單號 = 'AA01';
select top 1 t1.序號+1 from [A010詢價單資料表-備註] t1
where not exists ( select 1 from [A010詢價單資料表-備註] t2 where t2.序號 = t1.序號 +1 and t2.詢價單號 = 'AA01' ) and t1. 詢價單號 = 'AA01'
order by t1.序號
注意:(有待改進)
若是 3 6 7 則補號為 4 而不是 1
若是 5 6 7 則補號為 8 而不是 1 -- 序號間無缺號
-------------------------------
正式應用:
insert into [Usys使用者資料表] (使用者ID) select min(使用者ID+1) from [Usys使用者資料表] where (not ((使用者ID+1) in (select 使用者ID from [Usys使用者資料表])))
sqlQuery = "insert into [Usys使用者資料表] (使用者ID,帳號,密碼,使用者名稱,Email,CreateDate,CreateUserID,CreateUserName," & _
"ModifyDate,ModifyUserID,ModifyUserName,SystemModifyDate)" & _
" select min(使用者ID+1),@帳號,@密碼,@使用者名稱,@Email,@建檔日,@建檔人ID,@建檔人," & _
"@修檔日,@修檔人ID,@修檔人,@系統修檔日 from [Usys使用者資料表]" & _
" where (not ((使用者ID+1) in (select 使用者ID from [Usys使用者資料表])));"
另一種insert的正式應用:
'找出 使用者 在此系統別下 所缺的程式...
'select 程式ID from Usys系統別程式資料表 where 系統ID = 1 and 程式ID not in (select 程式ID from Usys使用者程式資料表 where 使用者ID = 5);
'找將找出的程式record (多筆) 一筆一筆新增到Usys使用者程式資料表
Dim sqlQuery_Progs As String = "insert into [Usys使用者程式資料表] (使用者ID,程式ID) select " & DataGridView1.CurrentRow.Cells(0).Value & ", 程式ID from Usys系統別程式資料表 where 系統ID = " & Microsoft.VisualBasic.Left(frmEdit.ComboBox1.Text, InStr(frmEdit.ComboBox1.Text, "(") - 1) & " and 程式ID not in (select 程式ID from Usys使用者程式資料表 where 使用者ID = " & DataGridView1.CurrentRow.Cells(0).Value & ")"
',權限,執行權限,新增權限,修改權限,刪除權限,管理權限 DB已經有設置預設值都是 0
(承上)用另種方式來新增insert:
找出系統ID下的所有程式ID(Usys系統別程式資料表) 之後新增給 Usys使用者程式資料表 如果要新增的這個程式ID 並不存在於 Usys使用者程式資料表(即原本就存在就 不需再新增)
insert into Usys使用者程式資料表 (使用者ID,程式ID) select 5,程式ID from Usys系統別程式資料表 Where 系統ID = 1 and not exists (select * from Usys使用者程式資料表 where Usys系統別程式資料表.程式ID = Usys使用者程式資料表.程式ID)
缺點:
若無序號列存在,即無缺號被找到...
固也無法新增... (因為是null) insert 失敗!!
所以在新增前必須判斷缺號 count(id) 是否>0
若count(id) = 0 則 insert 時的序號 直接給定 1(sql字串 要換掉)
解決:沒有資料列時 則補1
select case when min(序號+1) is NULL then 1 else min(序號+1) end as lostnum from [A010詢價單資料表-備註] where (not ((序號+1) in (select 序號 from [A010詢價單資料表-備註] where 詢價單號 = 'AA01'))) and 詢價單號 = 'AA01';
最理想的解決--找出最小值:(等待神的出現....)
沒有資料列時 則補1
有資料列時 5 7 8 9 則補1 而不是 補6
有資料列時 6 7 8 9 則補1 而不是 補10(或4)
select & insert
insert into [tableDetail] (報表編號, 內容, 建檔日, 建檔人, 建檔人ID, 修檔日, 修檔人, 修檔人ID,系統修檔日)
select 報表編號, 瑕疵原因, 建檔日, 建檔人, 建檔人ID, 修改日, 修改人, 修改人ID,系統修改日 from [tableMain];
另一篇:
UPDATE & SELECT
參考:
藍色小惡魔討論區: SQL
SQL 自製流水號做法(有規律的序號)
SQL-自動補流水號
新增資料時自動產生識別代號的一些方法
获取自动编号的问题(经典实用)
返回已用编号、缺号分布字符串的处理示例
融合了补号处理的编号生成处理示例
SQL语句处理流水号编号补号
流水號自動補號和計算所缺最小號和最大號
自动生成序号的存储过程
编号连续不能断号,断号后补号
[SQL] 流水號跳號
DB建置流水號問題
如何找出缺少的單據編號?能否用一個Select語句實現?
請問如何設計查詢找出缺的單號
数据库 查询缺号列出缺号的所有号码
UPDATE OR INSERT in one statement
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
第二種 INSERT INTO 能夠讓我們一次輸入多筆的資料。
使用 INSERT 與 SELECT 加入資料列
一次新增多筆資料 - INSERT ... SELECT
如何找到資料表某欄位第一個缺號的數值
SELECT INTO 和 INSERT INTO SELECT 區別
使用 INSERT 與 SELECT 加入資料列
避免自動增量 衝突pt1
避免自動增量 衝突pt2
一列数据存了一组不连续的正整数,求一SQL查询空缺的最小的值
Oracle层次查询和分析函数在号段选取中的应用
用VBA解決 自動編號的主KEY insert缺號
SQL::CASE, NULLIF() and ISNULL()
ISNULL (Transact-SQL)
NULLIF (Transact-SQL)
SQL - 使用 NULLIF
SQLServer 中的 ISNULL 和 NULLIF
SQL SERVER – Explanation and Comparison of NULLIF and ISNULL
ex: 流水序號(限integer編碼)
0 1 2 5 6 8 12 下一次 補上 3(最小號缺號) or 補上 11(最大號缺號)
0 1 2 3 4 5 最大(或最小) 都會補6
解決:
找出缺號中的最大值
select max(staff_sn-1) as lostnum from employee where (not ((staff_sn-1) in (select staff_sn from employee)))
select max(序號)-1 from [A010詢價單資料表-備註] a
where not exists(select 1 from [A010詢價單資料表-備註] where 序號=a.序號-1 and 詢價單號 = 'AA01') and 詢價單號 = 'AA01';
select top 1 t1.序號-1 from [A010詢價單資料表-備註] t1
where not exists ( select 1 from [A010詢價單資料表-備註] t2 where t2.序號 = t1.序號 -1 and t2.詢價單號 = 'AA01' ) and t1. 詢價單號 = 'AA01'
order by t1.序號 DESC
注意:(有待改進)
若是 5 6 7 則補號為 4 而不是 8 -- 序號間無缺號
若是 1 2 3 則補號為 0
若是 0 1 2 則補號為 -1
-------------------------------
找出缺號中的最小值
select min(staff_sn+1) as lostnum from employee where (not ((staff_sn+1) in (select staff_sn from employee)))
select max(序號)+1 from [A010詢價單資料表-備註] a
where not exists(select 1 from [A010詢價單資料表-備註] where 序號=a.序號+1 and 詢價單號 = 'AA01') and 詢價單號 = 'AA01';
select top 1 t1.序號+1 from [A010詢價單資料表-備註] t1
where not exists ( select 1 from [A010詢價單資料表-備註] t2 where t2.序號 = t1.序號 +1 and t2.詢價單號 = 'AA01' ) and t1. 詢價單號 = 'AA01'
order by t1.序號
注意:(有待改進)
若是 3 6 7 則補號為 4 而不是 1
若是 5 6 7 則補號為 8 而不是 1 -- 序號間無缺號
-------------------------------
正式應用:
insert into [Usys使用者資料表] (使用者ID) select min(使用者ID+1) from [Usys使用者資料表] where (not ((使用者ID+1) in (select 使用者ID from [Usys使用者資料表])))
sqlQuery = "insert into [Usys使用者資料表] (使用者ID,帳號,密碼,使用者名稱,Email,CreateDate,CreateUserID,CreateUserName," & _
"ModifyDate,ModifyUserID,ModifyUserName,SystemModifyDate)" & _
" select min(使用者ID+1),@帳號,@密碼,@使用者名稱,@Email,@建檔日,@建檔人ID,@建檔人," & _
"@修檔日,@修檔人ID,@修檔人,@系統修檔日 from [Usys使用者資料表]" & _
" where (not ((使用者ID+1) in (select 使用者ID from [Usys使用者資料表])));"
另一種insert的正式應用:
'找出 使用者 在此系統別下 所缺的程式...
'select 程式ID from Usys系統別程式資料表 where 系統ID = 1 and 程式ID not in (select 程式ID from Usys使用者程式資料表 where 使用者ID = 5);
'找將找出的程式record (多筆) 一筆一筆新增到Usys使用者程式資料表
Dim sqlQuery_Progs As String = "insert into [Usys使用者程式資料表] (使用者ID,程式ID) select " & DataGridView1.CurrentRow.Cells(0).Value & ", 程式ID from Usys系統別程式資料表 where 系統ID = " & Microsoft.VisualBasic.Left(frmEdit.ComboBox1.Text, InStr(frmEdit.ComboBox1.Text, "(") - 1) & " and 程式ID not in (select 程式ID from Usys使用者程式資料表 where 使用者ID = " & DataGridView1.CurrentRow.Cells(0).Value & ")"
',權限,執行權限,新增權限,修改權限,刪除權限,管理權限 DB已經有設置預設值都是 0
(承上)用另種方式來新增insert:
找出系統ID下的所有程式ID(Usys系統別程式資料表) 之後新增給 Usys使用者程式資料表 如果要新增的這個程式ID 並不存在於 Usys使用者程式資料表(即原本就存在就 不需再新增)
insert into Usys使用者程式資料表 (使用者ID,程式ID) select 5,程式ID from Usys系統別程式資料表 Where 系統ID = 1 and not exists (select * from Usys使用者程式資料表 where Usys系統別程式資料表.程式ID = Usys使用者程式資料表.程式ID)
缺點:
若無序號列存在,即無缺號被找到...
固也無法新增... (因為是null) insert 失敗!!
所以在新增前必須判斷缺號 count(id) 是否>0
若count(id) = 0 則 insert 時的序號 直接給定 1(sql字串 要換掉)
解決:沒有資料列時 則補1
select case when min(序號+1) is NULL then 1 else min(序號+1) end as lostnum from [A010詢價單資料表-備註] where (not ((序號+1) in (select 序號 from [A010詢價單資料表-備註] where 詢價單號 = 'AA01'))) and 詢價單號 = 'AA01';
最理想的解決--找出最小值:(等待神的出現....)
沒有資料列時 則補1
有資料列時 5 7 8 9 則補1 而不是 補6
有資料列時 6 7 8 9 則補1 而不是 補10(或4)
select & insert
insert into [tableDetail] (報表編號, 內容, 建檔日, 建檔人, 建檔人ID, 修檔日, 修檔人, 修檔人ID,系統修檔日)
select 報表編號, 瑕疵原因, 建檔日, 建檔人, 建檔人ID, 修改日, 修改人, 修改人ID,系統修改日 from [tableMain];
另一篇:
UPDATE & SELECT
參考:
藍色小惡魔討論區: SQL
SQL 自製流水號做法(有規律的序號)
SQL-自動補流水號
新增資料時自動產生識別代號的一些方法
获取自动编号的问题(经典实用)
返回已用编号、缺号分布字符串的处理示例
融合了补号处理的编号生成处理示例
SQL语句处理流水号编号补号
流水號自動補號和計算所缺最小號和最大號
自动生成序号的存储过程
编号连续不能断号,断号后补号
[SQL] 流水號跳號
DB建置流水號問題
如何找出缺少的單據編號?能否用一個Select語句實現?
請問如何設計查詢找出缺的單號
数据库 查询缺号列出缺号的所有号码
UPDATE OR INSERT in one statement
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
第二種 INSERT INTO 能夠讓我們一次輸入多筆的資料。
使用 INSERT 與 SELECT 加入資料列
一次新增多筆資料 - INSERT ... SELECT
如何找到資料表某欄位第一個缺號的數值
SELECT INTO 和 INSERT INTO SELECT 區別
使用 INSERT 與 SELECT 加入資料列
避免自動增量 衝突pt1
避免自動增量 衝突pt2
一列数据存了一组不连续的正整数,求一SQL查询空缺的最小的值
Oracle层次查询和分析函数在号段选取中的应用
用VBA解決 自動編號的主KEY insert缺號
SQL::CASE, NULLIF() and ISNULL()
ISNULL (Transact-SQL)
NULLIF (Transact-SQL)
SQL - 使用 NULLIF
SQLServer 中的 ISNULL 和 NULLIF
SQL SERVER – Explanation and Comparison of NULLIF and ISNULL
2012年12月26日 星期三
[學習] decimal 小數點位數 四捨五入
[SQL]
select round(1.5446,2)
1.5400
互相比對結果值(EXCEL)
[VB]
小數點表示法
^[0-9]+(.[0-9]{1,6})?$
通過
0
0.
0.0
0.123456
123456789.123456
-----------------
資料庫 insert 時,decimal型態自動進位(四捨五入)。
假設小位數到3,資料庫 decimal型態就必須設置小數點到3。
當然在程式設計時,也必須 decimal 型態 到小數點3。
-----------------
1. 整數以下四捨五入
int(46410*0.05+0.5)=2321
2. 例 : 12.346 四捨五入至小數點以下一位
int(12.346*10+0.5)/10=12.3
3. 例 : 12.346 四捨五入至小數點以下二位
int(12.346*100+0.5)/100=12.35
參考:
select round(1.5446,2)
1.5400
select round(round(1.5446,3),2)
1.5500
select CAST(1.5446 AS decimal(9,2))
1.54
select CAST(1.546 AS decimal(9,2))
1.55
*資料型態decimal
-生產數、工作分鐘
-生產數、工作分鐘
SELECT 生產數,工作分鐘,
生產數/工作分鐘*60,
Convert(Decimal(18,4),生產數/工作分鐘)*60,
floor(convert(decimal(18,4),生產數/工作分鐘)*60),
floor(生產數/工作分鐘*60),
Round(生產數/工作分鐘*60,1) AS 小數第1位,
Round(生產數/工作分鐘*60,4) AS 小數第4位,
(生產數/工作分鐘*60*10+0.5)/10,
FLOOR(生產數/工作分鐘*60*10+0.5)/10
FROM tblA
[ACCESS]
SELECT 生產數,工作分鐘,
Round(生產數/工作分鐘*60,1),
Int(CDBL(生產數/工作分鐘)*60*10+0.5)/10 ,
Int((生產數/工作分鐘)*60*10+0.5)/10
FROM tblA
[VB]
小數點表示法
^[0-9]+(.[0-9]{1,6})?$
通過
0
0.
0.0
0.123456
123456789.123456
-----------------
資料庫 insert 時,decimal型態自動進位(四捨五入)。
假設小位數到3,資料庫 decimal型態就必須設置小數點到3。
當然在程式設計時,也必須 decimal 型態 到小數點3。
-----------------
1. 整數以下四捨五入
int(46410*0.05+0.5)=2321
2. 例 : 12.346 四捨五入至小數點以下一位
int(12.346*10+0.5)/10=12.3
3. 例 : 12.346 四捨五入至小數點以下二位
int(12.346*100+0.5)/100=12.35
參考:
浮點數計算結果更接近正解? 算錢用浮點,遲早被人扁
access中含四舍五入取值方法的查询sql语句
正確的四捨五入
Simple regular expression for a decimal with a precision of 2
Decimal or numeric values in regular expression validation
Regular expression for decimal number
Decimal 結構
decimal型数值插入数据库问题
收藏 用存储过程添加decimal数值小数点后的数字没有了
資料庫使用FLOAT欄位來記錄金額對嗎?
数据库库里decimal类型默认的四舍五入
C#,double和decimal数据类型以截断的方式保留指定的小数位数
[VB.NET] 四捨五入
[C#]無條件進位,無條件捨去及四捨五入寫法
[ACCESS]單精準數運算Round取到小數位數問題
Round 函數
access中含四舍五入取值方法的查询sql语句
正確的四捨五入
Simple regular expression for a decimal with a precision of 2
Decimal or numeric values in regular expression validation
Regular expression for decimal number
Decimal 結構
decimal型数值插入数据库问题
收藏 用存储过程添加decimal数值小数点后的数字没有了
資料庫使用FLOAT欄位來記錄金額對嗎?
数据库库里decimal类型默认的四舍五入
C#,double和decimal数据类型以截断的方式保留指定的小数位数
[VB.NET] 四捨五入
[C#]無條件進位,無條件捨去及四捨五入寫法
[ACCESS]單精準數運算Round取到小數位數問題
Round 函數
2012年12月17日 星期一
[SQL] 多欄位查詢
Dim str As String = "select * from [A010詢價單資料表-表頭] Where 1=1"
'選擇哪個查詢條件
Select Case frm詢價單search.TabControl1.SelectedIndex
Case 0 '一般
'SELECT 外調單號, 預訂交期
'FROM E010外調訂單資料表明細
'WHERE (DATEPART(yy, 預訂交期) = 2008) AND (DATEPART(mm, 預訂交期) = 8)
'ORDER BY 預訂交期
If frm詢價單search.TextBox1.Text <> "0" Then
'日期-年度
str = str + " and DATEPART(yy,日期) = " & _
frm詢價單search.TextBox1.Text.ToString & ""
End If
If frm詢價單search.ComboBox1.Text <> "0(全部)" Then
'日期-月份
str = str + " and DATEPART(mm,日期) = " & _
Microsoft.VisualBasic.Left(frm詢價單search.ComboBox1.Text, 2) & ""
End If
If frm詢價單search.ComboBox2.Text <> "0(全部)" Then
'業務員-編號
str = str + " and 業務員 = '" & _
Microsoft.VisualBasic.Left(frm詢價單search.ComboBox2.Text, InStr(frm詢價單search.ComboBox2.Text, "(") - 1) & "'"
End If
Case 1 '依客戶編號
If frm詢價單search.ComboBox3.Text <> "0(全部)" Then
'Dim 客戶編號() As String = frm詢價單search.ComboBox3.Text.Split(frm詢價單search.ComboBox3.Text.Split, "(")
'str = str + " and 客戶編號 = '" & _
' 客戶編號(0).Trim & "'"
str = str + " and 客戶編號 = '" & _
Microsoft.VisualBasic.Left(frm詢價單search.ComboBox3.Text, InStr(frm詢價單search.ComboBox3.Text, "(") - 1) & "'"
End If
'在之前有嚴格判別是否為日期格式 並且不是空白~~
If frm詢價單search.TextBox2.Text <> "" And frm詢價單search.TextBox3.Text <> "" Then
str = str + " and 日期 between '" & Format(CDate(frm詢價單search.TextBox2.Text), "yyyy/MM/dd") & "' and '" & Format(CDate(frm詢價單search.TextBox3.Text), "yyyy/MM/dd") & "'"
End If
Case 2 '依客戶訂號
If Not String.IsNullOrEmpty(frm詢價單search.TextBox4.Text) Then
If frm詢價單search.CheckBox1.Checked = True Then
str = str + " and 客戶訂號 = '" & _
frm詢價單search.TextBox4.Text & "'"
Else
str = str + " and 客戶訂號 like '%" & _
frm詢價單search.TextBox4.Text & "%'"
End If
End If
Case 3 '依單號
If Not String.IsNullOrEmpty(frm詢價單search.TextBox5.Text) Then
str = str + " and 詢價單號 = '" & _
frm詢價單search.TextBox5.Text & "'"
End If
End Select
'sqlQuery
MsgBox(str)
參考:
[習題]給初學者的範例,多重欄位搜尋引擎 for GridView #1
[MySQL Note.] 資料庫查詢抱怨(刪除線)優化筆記
多欄位的搜尋引擎
改善SQL效能的寫法
[SQL] 判斷空白
select top 1 staff_sn from retainJob where staff_sn = e.staff_sn and endDate is null order by startDate DESC
參考:
MS SQL與Oracle判斷欄位是否為NULL的方法比較,COALESCE()、ISNULL()、NVL()
SQL COALESCE() Very Cool, But Slower Than ISNULL()
SQL - 使用 NULLIF
SQLServer 中的 ISNULL 和 NULLIF
SQL SERVER – Explanation and Comparison of NULLIF and ISNULL
ISNULL (Transact-SQL)
NULLIF (Transact-SQL)
SQL::CASE, NULLIF() and ISNULL()
Access中的IsNull()
參考:
MS SQL與Oracle判斷欄位是否為NULL的方法比較,COALESCE()、ISNULL()、NVL()
SQL COALESCE() Very Cool, But Slower Than ISNULL()
SQL - 使用 NULLIF
SQLServer 中的 ISNULL 和 NULLIF
SQL SERVER – Explanation and Comparison of NULLIF and ISNULL
ISNULL (Transact-SQL)
NULLIF (Transact-SQL)
SQL::CASE, NULLIF() and ISNULL()
Access中的IsNull()
在Access中,IsNull的作用僅僅是判斷是否為空值
不過Access還是有支援MS-SQL IsNull的相似指令碼,在Access是用 iif 替代..
Select iif(IsNull( express ), value1, value2 ) From TableName
語法說明,判斷express是否為空,若是空的回傳value1,反之則回傳value2
[SQL] 判斷日期
Dim str As String = "select * from [A010詢價單資料表-表頭] Where 1=1"
'選擇哪個查詢條件
Select Case frm詢價單search.TabControl1.SelectedIndex
Case 0 '一般
'SELECT 外調單號, 預訂交期
'FROM E010外調訂單資料表明細
'WHERE (DATEPART(yy, 預訂交期) = 2008) AND (DATEPART(mm, 預訂交期) = 8)
'ORDER BY 預訂交期
If frm詢價單search.TextBox1.Text <> "0" Then
'日期-年度
str = str + " and DATEPART(yy,日期) = " & _
frm詢價單search.TextBox1.Text.ToString & ""
End If
If frm詢價單search.ComboBox1.Text <> "0(全部)" Then
'日期-月份
str = str + " and DATEPART(mm,日期) = " & _
Microsoft.VisualBasic.Left(frm詢價單search.ComboBox1.Text, 2) & ""
End If
........
參考:
MS-SQL時間格式一覽
MS SQL日期處理方法
MSSQL 抓取現在日期的函數
善用 SQL Server 中的 CONVERT 函數處理日期字串
SQL Server中使用convert转化长日期为短日期
sql使用convert转化长日期为短日期的总结
MS SQL 的datetime 格式轉換
MS SQL日期處理方法-整理(Date and Time Functions Tips)
SQL Server datetime LIKE select?
sql的between與查詢日期範圍
SQL between 日期范围
找出某個日期區間內的資料
各種日期時間計算
日期相減, 算出天數
計算日期的天數
計算兩個日期差距幾天
日期運算的小技巧整理(以起迄日期結束日期為例)
如何下日期相減後得到的是日期
SQL 日期的應用
在SQL中 得到日期 並格式化
TIPS-.NET DateTime Formating
Linq小技巧:日期處理
其它(日期)參考:
時間格式及方法運用
標準日期和時間格式字串
DateTime.GetDateTimeFormats 方法
DateTimeFormatInfo 類別
用DateTimeFormatInfo格式化日期时间(C#)
AM and PM with "Convert.ToDateTime(string)"
how get a.m. p.m. from DateTime?
自訂日期和時間格式字串
datetime.now first and last minutes of the day
SQL时间类型(DateTime)模糊查询及Between
善用 SQL Server 中的 CONVERT 函數處理日期字串
[SQL]使用BETWEEN要注意的地方
[筆記] SQL - between
[SQL] 多欄位查詢結果合併成一個字串
同個Row的兩個欄位(或N個欄位) 使用+ 來連接成一個欄位!
sqlQuery1:
SELECT (e.zhFname+e.zhName) as zhName,(e.enName+' '+e.enFname) as enName FROM table
顯示結果:
zhName = "林志玲"
enName = "LiYin Lin"
sqlQuery2:
SELECT (convert(nvarchar(4),系統ID) + '(' + 系統名稱 + ')') as 系統 FROM [Usys系統別資料表] WHERE 系統ID <> 0
顯示結果:
系統 = 1(內銷業務管理)
Note:
若有某一欄位型態不是字串(EX:integer ,double, etc... 日期沒試過~)
就必須 (convert(nvarchar(10),系統ID) 轉成字串
假設原本資料庫設定為 int(4) 其可表示範圍為
- 2,147,483,647 ~ 2,147,483,647
0~4,294,967,295 兩者皆為10位數
故轉字串時 就必須設 nvarchar(10) OR varchar(10)
否則會產生溢位錯誤...
參考:
select firstname+lastname from tb1;
用 + 做連接
+ (字串串連) (Transact-SQL)
CONCAT( ) 的語法
SQL Server 2012 :認識 CONCAT 字串函數
M$ sqlserver 2005
SQL 語法如何將多欄位查詢結果合併成一個字串
如何將多行查詢結果合併成單一字串?
SQL指令— CONCAT(字符串连接函数)
SQL 合并字段、拼字段、把多个数值拼写成一个字段。
===================================================
不同ROW的同一個欄位運用 FOR XML PATH 來連接成一個欄位!
資料結構:
語法 FOR XML PATH 之後的資料:
select [pro] from yiTest.dbo.person for xml path('');
select [pro]+',' from yiTest .dbo.person for xml path('');
SELECT
(
(SELECT ','+[pro]
FROM [yiTest].[dbo].[person] t2
--WHERE t2.id = t1.id
FOR XML PATH('')
)
)as [pro]
FROM
[yiTest].[dbo].[person] t1
SELECT
(
(SELECT ','+[pro]
FROM [yiTest].[dbo].[person] t2
WHERE t2.id = t1.id
FOR XML PATH('')
)
)as [pro]
FROM
[yiTest].[dbo].[person] t1
select id,name,
(select ','+pro from yiTest .dbo.person t1 where t1.id = t2.id for xml path('')) pro
from yiTest.dbo.person t2
group by id,name
參考:
SQL SERVER 2005 以後才支援 FOR XML PATH
SQL SERVER 2012 以後微軟提供了 CONCAT函數 來實現此功能
Concatenate the values in a column in SQL Server 2000 and 2005
使用 PATH 模式
一秒看破 T - SQL 多筆欄位合併
SQL 合并多条记录为一条
[SQL]將多筆資料合併為一筆顯示(FOR XML PATH)
[SQL]將多筆資料同一欄位值合併
[SQL] 多筆資料合併為一筆
灵活运用 SQL SERVER FOR XML PATH
SQL Server 2005 “FOR XML PATH” Multiple tags with same name
[MS SQL]將多筆資料合併欄位,減少不必要的連線
將多筆相同鍵值的欄位內容合併
T-SQL多筆輸出資料合併單一欄位輸出
使用 MSSQL 打造仿 MySQL 的group_concat 函数的山寨版
SQL語法如何將直的資料做橫向的字串連結
mssql2005如何实现类似GROUP_CONCAT (my-sql) 的功能
GROUP_CONCAT In MS-SQL
Simulating group_concat MySQL function in Microsoft SQL Server 2005?
Emulating MySQL’s GROUP_CONCAT() Function in SQL Server 2005
FOR XML PATH 多筆資料合併為一筆
FOR XML PATH 多筆資料合併為一筆
其它參考:
動態將多筆資料的特定欄位依分隔符號組成字串
[SQL]利用UNION ALL整合統計合併資料
[Oracle]請問如果查詢條件無資料能否顯示筆數為 0 呢?
SQL不同TABLE相同欄位合併的方法
MS SQL多表查詢合併
SQL合併查詢?(超難)
[Oracle]多筆資料合併在同一列上
SQL2005/2008手工注入之批量爆数据for xml path
使用 PIVOT 和 UNPIVOT 讓資料多列變成一列
SQL - 使用 PIVOT
動態 PIVOT 陳述式:Dynamic PIVOT
SQL資料轉行
續:SQL 資料轉行
SQL SERVER 2000/2005 列转行 行转列
sqlQuery1:
SELECT (e.zhFname+e.zhName) as zhName,(e.enName+' '+e.enFname) as enName FROM table
顯示結果:
zhName = "林志玲"
enName = "LiYin Lin"
sqlQuery2:
SELECT (convert(nvarchar(4),系統ID) + '(' + 系統名稱 + ')') as 系統 FROM [Usys系統別資料表] WHERE 系統ID <> 0
顯示結果:
系統 = 1(內銷業務管理)
Note:
若有某一欄位型態不是字串(EX:integer ,double, etc... 日期沒試過~)
就必須 (convert(nvarchar(10),系統ID) 轉成字串
假設原本資料庫設定為 int(4) 其可表示範圍為
- 2,147,483,647 ~ 2,147,483,647
0~4,294,967,295 兩者皆為10位數
故轉字串時 就必須設 nvarchar(10) OR varchar(10)
否則會產生溢位錯誤...
參考:
select firstname+lastname from tb1;
用 + 做連接
+ (字串串連) (Transact-SQL)
CONCAT( ) 的語法
SQL Server 2012 :認識 CONCAT 字串函數
M$ sqlserver 2005
SQL 語法如何將多欄位查詢結果合併成一個字串
如何將多行查詢結果合併成單一字串?
SQL指令— CONCAT(字符串连接函数)
SQL 合并字段、拼字段、把多个数值拼写成一个字段。
===================================================
不同ROW的同一個欄位運用 FOR XML PATH 來連接成一個欄位!
資料結構:
select [pro] from yiTest.dbo.person for xml path('');
select [pro]+',' from yiTest .dbo.person for xml path('');
SELECT
(
(SELECT ','+[pro]
FROM [yiTest].[dbo].[person] t2
--WHERE t2.id = t1.id
FOR XML PATH('')
)
)as [pro]
FROM
[yiTest].[dbo].[person] t1
SELECT
(
(SELECT ','+[pro]
FROM [yiTest].[dbo].[person] t2
WHERE t2.id = t1.id
FOR XML PATH('')
)
)as [pro]
FROM
[yiTest].[dbo].[person] t1
select id,name,
(select ','+pro from yiTest .dbo.person t1 where t1.id = t2.id for xml path('')) pro
from yiTest.dbo.person t2
group by id,name
參考:
SQL SERVER 2005 以後才支援 FOR XML PATH
SQL SERVER 2012 以後微軟提供了 CONCAT函數 來實現此功能
Concatenate the values in a column in SQL Server 2000 and 2005
使用 PATH 模式
一秒看破 T - SQL 多筆欄位合併
SQL 合并多条记录为一条
[SQL]將多筆資料合併為一筆顯示(FOR XML PATH)
[SQL]將多筆資料同一欄位值合併
[SQL] 多筆資料合併為一筆
灵活运用 SQL SERVER FOR XML PATH
SQL Server 2005 “FOR XML PATH” Multiple tags with same name
[MS SQL]將多筆資料合併欄位,減少不必要的連線
將多筆相同鍵值的欄位內容合併
T-SQL多筆輸出資料合併單一欄位輸出
使用 MSSQL 打造仿 MySQL 的group_concat 函数的山寨版
SQL語法如何將直的資料做橫向的字串連結
mssql2005如何实现类似GROUP_CONCAT (my-sql) 的功能
GROUP_CONCAT In MS-SQL
Simulating group_concat MySQL function in Microsoft SQL Server 2005?
Emulating MySQL’s GROUP_CONCAT() Function in SQL Server 2005
FOR XML PATH 多筆資料合併為一筆
FOR XML PATH 多筆資料合併為一筆
其它參考:
動態將多筆資料的特定欄位依分隔符號組成字串
[SQL]利用UNION ALL整合統計合併資料
[Oracle]請問如果查詢條件無資料能否顯示筆數為 0 呢?
SQL不同TABLE相同欄位合併的方法
MS SQL多表查詢合併
SQL合併查詢?(超難)
[Oracle]多筆資料合併在同一列上
SQL2005/2008手工注入之批量爆数据for xml path
使用 PIVOT 和 UNPIVOT 讓資料多列變成一列
SQL - 使用 PIVOT
動態 PIVOT 陳述式:Dynamic PIVOT
SQL資料轉行
續:SQL 資料轉行
SQL SERVER 2000/2005 列转行 行转列
2012年11月20日 星期二
[學習] 多使用者 處理 同一筆資料 防止 race condition
系統架構
User1(程式)
<---------> SV1(WebService) <---------> SV2(DataBase)
User2(程式)
.
.
.
UserN(程式)
(強碰問題~ 幾乎很少發生!!)
1.(程式-產生序號 Fetch From DB & +1) ex: sn+=1
當多個user同時處理同一筆record時~~
在不違反商業邏輯狀態下,直接覆蓋(update)前者的資料~~
每個record都會有記錄欄位,記錄修改者是誰~~
2.(程式-產生序號 Fetch From DB & +1) ex: sn+=1
在user1處理A-record時 不讓其它user同時處理A-record
user1(程式) 發出個訊息(參數) 給 SV1
其它user處理record時 並先與SV1判斷是否同record
若是 則告知其它user 目前不能用
-但會有網路斷線問題~~
-故需要一個機制~~
-那便是一個處理record的時間~~
-並在n分鐘內不讓其它使用者處理同一筆record~~
時間可存在 DataBase(同一筆record的欄位) 或 SV1
參考:
用 SELECT ... FOR UPDATE 避免 Race condition
数据库插入,多人操作,如何能做到绝对不重复插入?
select 後 insert
競爭危害
User1(程式)
<---------> SV1(WebService) <---------> SV2(DataBase)
User2(程式)
.
.
.
UserN(程式)
(強碰問題~ 幾乎很少發生!!)
1.(程式-產生序號 Fetch From DB & +1) ex: sn+=1
當多個user同時處理同一筆record時~~
在不違反商業邏輯狀態下,直接覆蓋(update)前者的資料~~
每個record都會有記錄欄位,記錄修改者是誰~~
2.(程式-產生序號 Fetch From DB & +1) ex: sn+=1
在user1處理A-record時 不讓其它user同時處理A-record
user1(程式) 發出個訊息(參數) 給 SV1
其它user處理record時 並先與SV1判斷是否同record
若是 則告知其它user 目前不能用
-但會有網路斷線問題~~
-故需要一個機制~~
-那便是一個處理record的時間~~
-並在n分鐘內不讓其它使用者處理同一筆record~~
時間可存在 DataBase(同一筆record的欄位) 或 SV1
參考:
用 SELECT ... FOR UPDATE 避免 Race condition
数据库插入,多人操作,如何能做到绝对不重复插入?
select 後 insert
競爭危害
訂閱:
文章 (Atom)






