2017年12月5日 星期二

☆SQLServer/Issue/SQL 將數據類型 varchar 轉換為 numeric 時出錯

[SQL Server][Issue][SQL] 


[案例說明][Explain]

SQL Server Version -> 2012

透過cast或convert將nvarchar或varchar轉換為數字型態時,因資料內容問題發生的錯誤:
訊息:將數據類型 nvarchar 轉換為 numeric 時出錯

Solution1
 使用ISNUMBERIC功能過濾錯誤的資料內容(官方說明)

EXAMPLE

select * from testtab
where ISNUMERIC(欄位) = 0




Solution2

若使用ISNUMERIC後仍然出現錯誤,可能是因為資料中有科學符號造成
先轉成float格式之後再轉numeric即可



select cast(  cast(欄位 as float) as numeric(10,6)  )  from testtab;

2017年12月4日 星期一

☆Windows/Batch/Command Windows批次上傳FTP指令

[Windows][Batch][Command] 


[需求說明][Request]

Windows Server Version -> 2012

Windows Server需要定期的將備份資料,上傳至異地端的FTP Server。
要實現這個功能,一般我們會用Windows排程器+Batch Command(批次檔案)來處理,Windows排程器也是就Windows作業系統內建的排程軟體,一般從系統管理中可以找到(每個版本可能有點不同);Windows Batch則是早期從DOS時代就開始有的東西,如果比較資深的相信會很有感觸...這東西已經有點年代了(小弟我也有點年紀了XD),延申到Windows Server 2012之後的Power Shell是不一樣的東西,Power Shell是這幾年新的技術…有機會再來研究研究。

下面有兩個範例提供參考,一個是用純Windows指令上傳,另一個則是借用WinSCP上傳至FTP。

[實例][Example]
功能:自動上傳檔案至FTP,並刪除過期舊檔。
Test.bat 內容如下:

set PathDest=E:\backup
set FileCount=0

For /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set dt=%%a%%b%%c)

For /f "tokens=1-4 delims=:." %%a in ('echo %time%') do (set tm=%%a%%b)

For /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set dt2=%%a/%%b/%%c)

For /f "tokens=1-4 delims=:." %%a in ('echo %time%') do (set tm2=%%a:%%b)

FOR /f "tokens=1 " %%i IN ('hostname') DO (SET HOST=%%i)

set bkupfilename=Daily_backup_%dt%-%tm%.bak


xcopy  "E:\backup\*"   E:\backup\Daily /D/K/E/Y/C/I/H

del "E:\backup\*" /q

for /R %PathDest% %%A in (*) do set /a FileCount+=1

if %FileCount% GTR 7(^
forfiles /p %PathDest% /s /d -7 /c "cmd /c del /q @path"
)

E:
cd E:\backup\dpump

REM Generate the script. Will overwrite any existing temp.txt
echo open ftpservername> temp.txt
echo user>> temp.txt
echo password>> temp.txt
echo bin>> temp.txt
echo put %bkupfilename%>> temp.txt
echo quit>> temp.txt

REM Launch FTP and pass it the script
ftp -s:temp.txt

REM Clean up.
del temp.txt




[實例][Example]
功能:利用winscp工具軟體上傳檔案至FTP。

test.txt
open ftp://user:password@example.com/
put d:\bak\*.* /
exit

batch command
WinSCP.com /ini=nul /log=ftpupload.log /script=test.txt