多加寫了一段union的sql,該sql總共有6個欄位,
用一個foreach loop task來接收這個sql result set中每一筆的欄位值
結果,重新執行package後, 在loop里的script task出現"長度超過"的錯誤
逐一debug後,才發現新加的union sql中,某個欄位是一個計算欄位, 剛好, 符合的筆數都是由新增的union 中的sql所取得
原本在ssis是用一個int16的變數去接收, 由於sql 中,該計算欄位應是回傳integer型態,所以造成script task 中用到這個變數值時,己經是讀取到不正確的數值
後來在sql中,將該欄位轉型為smallint後,重跑package後就ok了.
因此,最好要確認union select 回傳的型態和ssis variable的型態要對應正確
2010年5月27日 星期四
2010年5月10日 星期一
Excel openrowset 奇怪的問題(續)
人客家的SSIS,一段時間後都會出現以下的錯誤.
剛開始一頭霧水,以為是上傳的EXCEL檔有問題,
後來發現,原本在SSMS使用正常的excel openrowset, 在同時間也無法使用.
檢查了EXCEL檔案內容,檢查了openrowset的語法, 都沒更動過也沒寫錯...怪哉.
所有的錯誤都出現在Data Flow Component 的OLEDB Source, 里頭放的是一段excel openrowset的語法:
SSIS 錯誤碼 DTS_E_OLEDBERROR。發生 OLE DB 錯誤。錯誤碼: 0x80040E14。
有 OLE DB 記錄可用。來源: "Microsoft SQL Native Client" Hresult: 0x80040E14 描述: "無法初始化連結伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.Jet.OLEDB.4.0" 的資料來源物件。"。
有 OLE DB 記錄可用。來源: "Microsoft SQL Native Client" Hresult: 0x80040E14 描述: "連結伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.Jet.OLEDB.4.0" 報告了錯誤。提供者並未給予任何關於錯誤的資訊。"。
載入封裝檔案 "D:\SSIS\subImport.dtsx" 時發生錯誤 0xC0012050。ExecutePackage 工作發生封裝驗證失敗。無法執行封裝。
最後,什麼都沒做,重新啟動SQL Server Services, 又回復正常.
這次,我依照之前遇到的怪問題的解法方法,
在機碼
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Providers\Microsoft.Jet.OLEDB.4.0 下新增一個名稱
DisallowAdHocAccess = 0
重新啟動SQL Server ,再觀察一段時間看看吧
剛開始一頭霧水,以為是上傳的EXCEL檔有問題,
後來發現,原本在SSMS使用正常的excel openrowset, 在同時間也無法使用.
檢查了EXCEL檔案內容,檢查了openrowset的語法, 都沒更動過也沒寫錯...怪哉.
所有的錯誤都出現在Data Flow Component 的OLEDB Source, 里頭放的是一段excel openrowset的語法:
SSIS 錯誤碼 DTS_E_OLEDBERROR。發生 OLE DB 錯誤。錯誤碼: 0x80040E14。
有 OLE DB 記錄可用。來源: "Microsoft SQL Native Client" Hresult: 0x80040E14 描述: "無法初始化連結伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.Jet.OLEDB.4.0" 的資料來源物件。"。
有 OLE DB 記錄可用。來源: "Microsoft SQL Native Client" Hresult: 0x80040E14 描述: "連結伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.Jet.OLEDB.4.0" 報告了錯誤。提供者並未給予任何關於錯誤的資訊。"。
"元件 "Excel OpenRowset" (1230)" 驗證失敗,傳回驗證狀態 "VS_ISBROKEN"。
一或多個元件驗證失敗
工作驗證期間發生錯誤。
載入封裝檔案 "D:\SSIS\subImport.dtsx" 時發生錯誤 0xC0012050。ExecutePackage 工作發生封裝驗證失敗。無法執行封裝。
最後,什麼都沒做,重新啟動SQL Server Services, 又回復正常.
這次,我依照之前遇到的怪問題的解法方法,
在機碼
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Providers\Microsoft.Jet.OLEDB.4.0 下新增一個名稱
DisallowAdHocAccess = 0
重新啟動SQL Server ,再觀察一段時間看看吧
2010年5月3日 星期一
SSMS 2008修改表格
在SSMS 2008的介面設計TABLE時, 如果新增或刪除欄位後按下儲存, 會出現
Saving changes is not permitted. The changes you have mad require then following tables to be dropped and re-created.......
懶得貼圖了
GOOGLE看到這篇文章 , 才知道, 訊息視窗右上方除了一個X之外,還有一個?, 按下去之後, SQL Server的HELP就告訴你要怎麼解決囉, 如下...
To change this option, on the Tools menu, click Options, expand Designers, and then click Table and Database Designers. Select or clear the Prevent saving changes that require the table to be re-created check box.
Saving changes is not permitted. The changes you have mad require then following tables to be dropped and re-created.......
懶得貼圖了
GOOGLE看到這篇文章 , 才知道, 訊息視窗右上方除了一個X之外,還有一個?, 按下去之後, SQL Server的HELP就告訴你要怎麼解決囉, 如下...
To change this option, on the Tools menu, click Options, expand Designers, and then click Table and Database Designers. Select or clear the Prevent saving changes that require the table to be re-created check box.
2010年4月27日 星期二
SSRS render excel 怪事
有一張用SSRS2005做出來的表,在TABLE HEADER要依資料動態顯示不同的TITLE
在IE 瀏覽看來都很正常,但匯出到EXCEL 2003 時,發現TITLE後面多了一個空白,以致於匯出到EXCEL 2003後,表頭內的文字變成了二行,其中第二行是空白, 但匯出PDF和列印都是正常
必須手動在這個儲存格中,後面的空白刪掉,表頭才會顯示正常
因為匯出EXCEL 2003才有這個問題,而且匯出EXCEL 2007沒有這個問題, 所以一直以為是RDL render 的問題
由於表頭的值是依dataset 的某VARCHAR欄位動顯示出來的, 所以回頭去看TABLE內的欄位值時,也沒發現有任何空白存在.
直到, 用SQL LEN function去查看欄位的長度時,才發現,原本應該只有長度9的內容值,竟然變成10
光是用眼睛看,真的明明只有看到 9個中文字啊...
再查了一下, select len(replace(orgnDescription,char(13),'')) from organization
原來欄位內容值最後面多了一個換行符號(當初這個資料是轉進來的)
執行更新語法後, update organization set orgnDescription = replace(orgnDescription,char(13),'')
再查詢報表,匯出EXCEL , 問題就解決了.
所以開發後,要測試,除了IE版本要比照人客的環境外,連OFFICE也得要一致才行啊
在IE 瀏覽看來都很正常,但匯出到EXCEL 2003 時,發現TITLE後面多了一個空白,以致於匯出到EXCEL 2003後,表頭內的文字變成了二行,其中第二行是空白, 但匯出PDF和列印都是正常
必須手動在這個儲存格中,後面的空白刪掉,表頭才會顯示正常
因為匯出EXCEL 2003才有這個問題,而且匯出EXCEL 2007沒有這個問題, 所以一直以為是RDL render 的問題
由於表頭的值是依dataset 的某VARCHAR欄位動顯示出來的, 所以回頭去看TABLE內的欄位值時,也沒發現有任何空白存在.
直到, 用SQL LEN function去查看欄位的長度時,才發現,原本應該只有長度9的內容值,竟然變成10
光是用眼睛看,真的明明只有看到 9個中文字啊...
再查了一下, select len(replace(orgnDescription,char(13),'')) from organization
原來欄位內容值最後面多了一個換行符號(當初這個資料是轉進來的)
執行更新語法後, update organization set orgnDescription = replace(orgnDescription,char(13),'')
再查詢報表,匯出EXCEL , 問題就解決了.
所以開發後,要測試,除了IE版本要比照人客的環境外,連OFFICE也得要一致才行啊
2010年4月21日 星期三
SQL 2005 Job Mail 通知
SQL 2005後,提供了Database Mail的功能,可以利用SMTP MAIL設定JOB執行狀況的EMAIL通知
在SQL 2000的時代,未曾使用過SQL MAIL, 既然SQL 2005有了這麼方便的SMTP MAIL功能,那就來試看看, 因為主要是想要知道每天排程的JOB到底是成功還是失敗. 不然每次都等人客打電話來通知,實在是太沒面子了.
1.開啟SQL SERVER 2005 的Database Mail,
sp_configure 'show advanced', 1;
sp_configure 'Database Mail XPs', 1;
GO
RECONFIGURE;
GO
2.設定Database Mail, 可以使用SSMS->Management下的Database Mail以精靈的方式設定 MSSQLTip上有完整的說明及畫面 http://www.mssqltips.com/tip.asp?tip=1100, 如果要用SCRIPT新增,可以參考MSDN上的範例,我修改後如下
-- Create a Database Mail account
EXECUTE msdb.dbo.sysmail_add_account_sp
@account_name = 'testAccount',
@description = 'Mail account for test e-mail.',
@email_address = 'test@mail.test.com',
@replyto_address = null,
@display_name = 'testMailer',
@mailserver_name = 'mail.test.com' ;
-- Create a Database Mail profile
EXECUTE msdb.dbo.sysmail_add_profile_sp
@profile_name = 'testProfile',
@description = 'Profile used for test mail.' ;
-- Add the account to the profile (一個profile可有多個account)
EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
@profile_name = 'testProfile',
@account_name = 'testAccount',
@sequence_number =1 ;
-- Grant access to the profile to the DBMailUsers role
EXECUTE msdb.dbo.sysmail_add_principalprofile_sp
@principal_name = 'public',
@profile_name = 'testProfile',
@is_default = 1 ;
3.在SQL Server Agent 按右鍵選properties, 進入後在Alert System 下 勾選 Enable mail profile,挑選步驟2所設定的profile name
4.在SQL Server Agent 下,找到Operators目錄,按右鍵New operator, 在Name給這個operator指定一個名稱,在E-mail name 輸要發送的對象E-mail, 如果有多個就用;隔開,例如test1@mail.com.tw;test2@mail.com.tw, 以此類推
當然, 你可在此建立多個不同用途的operator, 以方不同性質的job針對不同管理者進行通知
5.最後是....記得重新啟動SQL Server Agent 服務....大功告成
做個測試....
建一個job, 隨便做一個會出錯的step, 例如讀一個不存在的table, select 1 from xxx
在job的Notification中, 勾選E-mail, 選擇步驟4所建立的Operator, 然後指定When the job fails , 這樣當step 執行有錯誤時,就會啟動送email的機制了.
如果以上通通沒搞錯, 試跑一下job, 就收到錯誤email通知了
JOB RUN: 'test' was run on 2010/4/21 at 下午 10:05:16
DURATION: 0 hours, 0 minutes, 0 seconds
STATUS: Failed
MESSAGES: The job failed. The Job was invoked by User win2003\Administrator. The last step to run was step 1 (test).
缺點是....錯誤訊息太精簡了, 也許就只是通知(notification) .
google了一下, 看看這篇文章, 自已想辦法去讀取sysjobstepslogs的完整錯誤吧
以後再試
在SQL 2000的時代,未曾使用過SQL MAIL, 既然SQL 2005有了這麼方便的SMTP MAIL功能,那就來試看看, 因為主要是想要知道每天排程的JOB到底是成功還是失敗. 不然每次都等人客打電話來通知,實在是太沒面子了.
1.開啟SQL SERVER 2005 的Database Mail,
sp_configure 'show advanced', 1;
sp_configure 'Database Mail XPs', 1;
GO
RECONFIGURE;
GO
2.設定Database Mail, 可以使用SSMS->Management下的Database Mail以精靈的方式設定 MSSQLTip上有完整的說明及畫面 http://www.mssqltips.com/tip.asp?tip=1100, 如果要用SCRIPT新增,可以參考MSDN上的範例,我修改後如下
-- Create a Database Mail account
EXECUTE msdb.dbo.sysmail_add_account_sp
@account_name = 'testAccount',
@description = 'Mail account for test e-mail.',
@email_address = 'test@mail.test.com',
@replyto_address = null,
@display_name = 'testMailer',
@mailserver_name = 'mail.test.com' ;
-- Create a Database Mail profile
EXECUTE msdb.dbo.sysmail_add_profile_sp
@profile_name = 'testProfile',
@description = 'Profile used for test mail.' ;
-- Add the account to the profile (一個profile可有多個account)
EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
@profile_name = 'testProfile',
@account_name = 'testAccount',
@sequence_number =1 ;
-- Grant access to the profile to the DBMailUsers role
EXECUTE msdb.dbo.sysmail_add_principalprofile_sp
@principal_name = 'public',
@profile_name = 'testProfile',
@is_default = 1 ;
3.在SQL Server Agent 按右鍵選properties, 進入後在Alert System 下 勾選 Enable mail profile,挑選步驟2所設定的profile name
4.在SQL Server Agent 下,找到Operators目錄,按右鍵New operator, 在Name給這個operator指定一個名稱,在E-mail name 輸要發送的對象E-mail, 如果有多個就用;隔開,例如test1@mail.com.tw;test2@mail.com.tw, 以此類推
當然, 你可在此建立多個不同用途的operator, 以方不同性質的job針對不同管理者進行通知
5.最後是....記得重新啟動SQL Server Agent 服務....大功告成
做個測試....
建一個job, 隨便做一個會出錯的step, 例如讀一個不存在的table, select 1 from xxx
在job的Notification中, 勾選E-mail, 選擇步驟4所建立的Operator, 然後指定When the job fails , 這樣當step 執行有錯誤時,就會啟動送email的機制了.
如果以上通通沒搞錯, 試跑一下job, 就收到錯誤email通知了
JOB RUN: 'test' was run on 2010/4/21 at 下午 10:05:16
DURATION: 0 hours, 0 minutes, 0 seconds
STATUS: Failed
MESSAGES: The job failed. The Job was invoked by User win2003\Administrator. The last step to run was step 1 (test).
缺點是....錯誤訊息太精簡了, 也許就只是通知(notification) .
google了一下, 看看這篇文章, 自已想辦法去讀取sysjobstepslogs的完整錯誤吧
以後再試
2010年4月14日 星期三
SSMS 類別未登錄
在WINDOW 7上先安裝SQL SERVER 2008 Standard Edition 64bit, 後來因為OPENQUERY EXCEL 尚不支援64BIT 的EXCEL JET ENGINE,所以在同一台機器,我又安裝32BIT的SQL SERVER 2005
裝完後,二個版本的SQL SERVER使用起來相安無事,直到上週因為SSRS版本的問題,我重新安裝了SQL 2008 SP1後, 在SSMS 2005 下開啟原本就在使用的SOLUTION後,三不五時就出現這個錯
Microsoft SQL Server Management Studio
類別未登錄 (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
Microsoft SQL Server Management Studio
The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
很奇怪的是,時好時壞,有時可以順利打開,但有時關機後重開機就又不行了.
GOOGLE了一下, 微軟官方網站有這麼一個KB 961638
建議的解決方法
1. 改用SSMS 2008開啟你的方案吧......是可以...不過OPENQUERY EXCEL時又要回到SSMS 2005.很麻煩
2.重新安裝SQL SERVER 2005....我也很想....但應該也是一個麻煩事吧
2010/10/26 依MS Connect 重裝的指令測試,
Start /wait E:\Software\MicroSoft\SQL2005\StandardENG\DISC1\setup.exe /qb INSTANCENAME=yourserver REINSTALL=ALL REINSTALLMODE=omus SAPWD=yourpwd
裝完2005後, 變成2008R2嗝屁了...
看來MS自家的產品也是有很大的 DLL HELL啊.
裝完後,二個版本的SQL SERVER使用起來相安無事,直到上週因為SSRS版本的問題,我重新安裝了SQL 2008 SP1後, 在SSMS 2005 下開啟原本就在使用的SOLUTION後,三不五時就出現這個錯
Microsoft SQL Server Management Studio
類別未登錄 (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
Microsoft SQL Server Management Studio
The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
很奇怪的是,時好時壞,有時可以順利打開,但有時關機後重開機就又不行了.
GOOGLE了一下, 微軟官方網站有這麼一個KB 961638
建議的解決方法
1. 改用SSMS 2008開啟你的方案吧......是可以...不過OPENQUERY EXCEL時又要回到SSMS 2005.很麻煩
2.重新安裝SQL SERVER 2005....我也很想....但應該也是一個麻煩事吧
2010/10/26 依MS Connect 重裝的指令測試,
Start /wait E:\Software\MicroSoft\SQL2005\StandardENG\DISC1\setup.exe /qb INSTANCENAME=yourserver REINSTALL=ALL REINSTALLMODE=omus SAPWD=yourpwd
裝完2005後, 變成2008R2嗝屁了...
看來MS自家的產品也是有很大的 DLL HELL啊.
2010年4月8日 星期四
WINDOWS 7 移除SQL 2008 SP1
這二天在使用SQL Server Reporting Server時,發現SSMS上顯示的版本竟然還停在10.0.1600 明明已經安裝過Service Pack 1了,版本應該是10.00.2531 才對
想要重新安裝Service Pack 1時, 結果說不需任何更新, 同時畫面上顯示著Reporting Server是10.00.2531
怪哉, 明明SSMS上的Report Services的版本是10.00.1600
所以只好先移除再安裝一次看看了
在控制台的程式集選解除安裝程式,進入後在左方選檢視安裝的更新
進入後即可看到機器所安裝的更新程式
選擇SQL Server 2008 Service Pack 1解除安裝即可
解除過程式會要求讀取原sql server 安裝光碟片.
解除完畢,重新開機
後記:
重裝後, SSMS上 Report Server的版本還是10.0.1600? 一頭霧水...
順便記載SQL Server 2008的版本說明 http://www.microsoft.com/sqlserver/2008/en/us/editions.aspx
及適用的作業系統 http://msdn.microsoft.com/en-us/library/ms143506.aspx#EEx64
想要重新安裝Service Pack 1時, 結果說不需任何更新, 同時畫面上顯示著Reporting Server是10.00.2531
怪哉, 明明SSMS上的Report Services的版本是10.00.1600
所以只好先移除再安裝一次看看了
在控制台的程式集選解除安裝程式,進入後在左方選檢視安裝的更新
進入後即可看到機器所安裝的更新程式
選擇SQL Server 2008 Service Pack 1解除安裝即可
解除過程式會要求讀取原sql server 安裝光碟片.
解除完畢,重新開機
後記:
重裝後, SSMS上 Report Server的版本還是10.0.1600? 一頭霧水...
順便記載SQL Server 2008的版本說明 http://www.microsoft.com/sqlserver/2008/en/us/editions.aspx
及適用的作業系統 http://msdn.microsoft.com/en-us/library/ms143506.aspx#EEx64
訂閱:
文章 (Atom)
pdf.js 無法顯示部份字
有個檔案在pdf viewer套件中無法顯示內容,但下載檔案後使用工具又可以正常顯示。 本來以為是套件版本太舊的原因,於是去下載pdf viewer套件 https://github.com/mozilla/pdf.js 更新後還是一樣。 覺得應是字型缺漏的問題,於是用PDF-X...
-
上網找了免費的白箱檢測工具,找到了 puma scan 因為支援OWASP TOP 10的檢測,所以這是一個符合客戶需求又能與Visual studio結合的工具(白話說...交差了事矣....) 更重要的是這不用錢....檢測工具都貴森森的,尤其是源碼檢測工具。 ht...
-
建了一個工作排程,定時執行batch檔。 batch中寫了一段xcopy,主要針對有異動較新檔案時才複製。 echo off for /f "delims=" %%a in ('wmic OS Get localdatetime ^| find...
-
改用SQL Server Management Studio 2017有一段時間了。 在執行一段之前寫的SQL要組出一段語法時,里頭包含了使用CHAR(10)當作換行符號的文字,在輸出結果中,使用複製貼上的方式要進行執行時,發現換行符號都失效了。 但如果使用Results...