顯示具有 SQL 標籤的文章。 顯示所有文章
顯示具有 SQL 標籤的文章。 顯示所有文章

Business Intelligence (BI) 雜記 02

依據 [Wiley] Professional Microsoft SQL Server Analysis Services 2008 with MDX 一書,第二章的內容操作 (P52~P55),將規劃好的 Analysis Service 內容 Deploy 到 Analysis Server ,也就是執行點選 Project name 並按下右鍵/Deploy。

結果得到的錯誤!

image

 

Error 14    內部錯誤: 作業未成功地結束。
Error 16    OLAP 儲存引擎有錯誤: 處理 'AnalysisServices2008Tutorial_01' 資料庫中之 'Dim Customer' 維度的 'Dim Customer' 屬性時發生錯誤。
Error 17    OLAP 儲存引擎有錯誤: 處理作業已結束,因為處理期間發現的錯誤數目已達該作業所定義的可允許錯誤上限。
Error 18    伺服器: 作業已經取消。

因剛開始學習此類知識,尚無能力解決這個問題;只能先避開這個問題,好讓學習的步伐可以繼續往前行。

解決方法:暫時對 Dim Customer 維度的內容,不加以修改。就可以正常 Deploy 專案。

Business Intelligence (BI) 雜記 01

依據 [Wiley] Professional Microsoft SQL Server Analysis Services 2008 with MDX 一書,第二章的內容操作 (先排除 P52~P55 的細部內容調整),將規劃好的 Analysis Service 內容 Deploy 到 Analysis Server ,也就是執行點選 Project name 並按下右鍵/Deploy。

結果得到錯誤訊息!

------------------------------

Cannot connect to (local).

------------------------------
ADDITIONAL INFORMATION:

Login failed for user 'GC-IT-N01\UserName'. (Microsoft SQL Server, Error: 18456)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&EvtSrc=MSSQLServer&EvtID=18456&LinkId=20476

------------------------------

image

image

 

連接到 http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&EvtSrc=MSSQLServer&EvtID=18456&LinkId=20476

看到下列處理建議:

User Action

  • If you are trying to connect using SQL Server Authentication, verify that SQL Server is configured in Mixed Authentication Mode.
    利用 SQL Server 驗證方式連接資料庫,檢查是否使用混合驗證模式。
  • If you are trying to connect using SQL Server Authentication, verify that SQL Server login exists and that you have spelled it properly.
    利用 SQL Server 驗證方式連接資料庫,檢查登入(login)是否存在或拼字是否正確。
  • If you are trying to connect using Windows Authentication, verify that you are properly logged into the correct domain.
    利用 Windows 驗證方式連接資料庫,檢查是否使用正確網域登入。
  • If your error indicates state 1, contact your SQL Server administrator.


先後依據建議事項,做了各項檢查,結果問題還是存在。

最後找到問題的終結原因,就是開啟 Business Intelligence Development Studio (BIDS) 程式時的權限不足所致。
需要以 系統管理員身份 運作才行。

Business Intelligence Development Studio (BIDS) 的程式名稱:devenv.exe

程式路徑:"C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\"

為該程式建立程式捷徑在桌面上,日後開啟程式就以系統管理員身份 來運行。

image

Business Intelligence (BI) @ Windows 7.0

第一次在 Windows 7.0 環境中,接觸到 BI 的範例介紹與學習,相關書籍的作者一定會提到,要將設計的專案 Deploy 到 Analysis Server 的動作,也就是執行點選 Project name 並按下右鍵/Deploy。

結果得到的錯誤!

image

image


怎會這樣?那裡出錯了?

查!查!查!

原來是開啟 BIDS (Business Intelligence Development Studio) 的權限不足。

image


應該要用 系統管理者 的身份來執行。

image

 

若是你使用 64 位元的程式環境,請注意下列檔案存放位置:

BIDS (Business Intelligence Development Studio)
檔名:DEVENV.EXE
位置 - C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe

SSMS (SQL Server Management Studio)
檔名:SSMS.EXE
位置 - D:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe

Business Intelligence (BI) 探勘之旅:

Foundations of SQL Server 2008 R2 Business Intelligence 這是一本由 Apress 公司出版的電腦書籍。
ISBN:978-1430233244

該書介紹 Microsoft SQL Server2008 R2 在 Business Intelligence (BI) 之相關知識及技巧。
在第一章中,就以實例說明,帶領學員逐步學習新的知識:

1.  Open the SQL Server Business Intelligence Development Studio (BIDS) from the Start menu.
2.  From the BIDS menu, click File ➤ Open Project/Solution.
Browse to C:\Program Files\Microsoft SQL Server\100\Tools\Samples\AdventureWorks 2008R2 Analysis Services Project\standard, select the file Adventure Works.sln, and click Open

不料,在第二步就遇到瓶頸,既然在電腦中找不到 Adventure Works.sln 檔案。

查詢網路後,卻得到一大堆方法及檔案可下載,經過逐一檢查卻發現,都不是需要的答案。

經歷多番折騰後,才找到要下載 AdventureWorks 2008R2 Analysis Services project,只要此 *.zip 內容解壓到 C:\Program Files\Microsoft SQL Server\100\Tools\Samples\ 文件夾下即可。

資源下載點:


在 SQL 範例安裝方面,有一篇文章值得參考:
Install AdventureWorks Sample Databases - (SQL Server 2008 R2) by Jeff Hunter, Sr. Database Administrator
http://www.idevelopment.info/data/SQLServer/DBA_tips/Installation/INSTALL_10.shtml

PowerShell Snapin (嵌入式管理單元)

PowerShell Snapin (嵌入式管理單元),內建有七種。若有需要可再以外掛方式來增加。

內建的七種單元:

  • Microsoft.PowerShell.Diagnostics
    這個 Windows PowerShell 嵌入式管理單元包含 Windows Eventing 及 效能計數器 Cmdlet。
  • Microsoft.WSMan.Management
    這個 PS 嵌入式管理單元包含 Cmdlet (例如 WSManInstance 和 Set-WSManInstance),Windows PowerShell 主機會使用這些 Cmdlet 管理 WsMan 作業。
  • Microsoft.PowerShell.Core
    這個 Windows PowerShell 嵌入式管理單元包含用於管理 Windows PowerShell 元件的 Cmdlet。
  • Microsoft.PowerShell.Utility
    這個 Windows PowerShell 嵌入式管理單元包含用於操控資料的公用程式 Cmdlet。
  • Microsoft.PowerShell.Host
    這個 Windows PowerShell 嵌入式管理單元包含供 Windows PowerShell 主控台主機使用的 Cmdlet (例如 Start-Transcript 和 Stop-Transcript )。
  • Microsoft.PowerShell.Management
    這個 Windows PowerShell 嵌入式管理單元包含用於管理 Windows 元件的管理 Cmdlet。
  • Microsoft.PowerShell.Security
    這個 Windows PowerShell 嵌入式管理單元包含用來管理 Windows PowerShell 安全性的 Cmdlet。

上述單元內容,可執行 Get-PSSnapin 得知。

 

若是要增加,使用指令:Add-PSSnapin。
    Add-PSSnapin SqlServerProviderSnapin100
    Add-PSSnapin SqlServerCmdletSnapin100

若是要移除,使用指令:Move-PSSnapin。
    Move-PSSnapin SqlServerProviderSnapin100
    Move-PSSnapin SqlServerCmdletSnapin100

可執行 Get-PSSnapin –Registered 得知,目前所有外掛的 Snapin 有哪些?

使用 T-SQL 深入了解 SQL Server 的基本資料

EXECUTE xp_regread @rootkey='HKEY_LOCAL_MACHINE',
                   @key='SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL',
                   @value_name='MSSQLSERVER'

Value Data
MSSQLSERVER MSSQL10_50.MSSQLSERVER

 

可使用 SELECT SERVERPROPERTY() 得到 Server 的相關資料。
如:

  • SELECT SERVERPROPERTY('ServerName')
  • SELECT SERVERPROPERTY('InstanceName')
  • SELECT SERVERPROPERTY('productversion')
  • SELECT SERVERPROPERTY ('productlevel')
  • SELECT SERVERPROPERTY ('edition')
  • GC-IT-N01
  • NULL
  • 10.50.1600.1
  • RTM
  • Standard Edition (64-bit)
  • SELECT @@servername
  • SELECT @@VERSION
  • GC-IT-N01
  • Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)   Apr  2 2010 15:48:46   Copyright (c) Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

 

SELECT SERVERPROPERTY('InstanceName') 的資料,來自於:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL

 

SELECT SERVERPROPERTY('productversion') 的資料,來自於:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\ClientSetup\CurrentVersion

 

SQL Server Instances

In order to really understand what versions of SQL Server are installed, you have to understand SQL Server Instances. Each instance of SQL Server operates independently and contains its own collection of databases and settings. There are two types of instances:

Default Instance a single instance named MSSQLSERVER. You connect to this instance using only the server name (ex: localhost)
Named Instance one or more instances. You connect to these instances uing the server name + instance name (ex: localhost\SQLEXPRESS)

 

It's possible have only one instance installed on your machine. But it's also possible to have many instances. And each of those instances could be a different version of SQL Server!

To understand your scenario, use the SQL Server Configuration Manager tool that installs with both SQL Server 2005 and 2008.
On the start menu, expand the "Microsoft SQL Server [YOURVERSION]" menu, and then expand the "Configuration Tools" submenu. Launch the SQL Server Configuration Manager tool.
Here is a screen shot to use as an example:

image

點選右側 SQL Server (MSSQLSERVER) 選項後,按右鍵/內容,可以看到如下結果:

image

 

對於軟體版本的進一步訊息,可參考

 

更多資訊可參考:
http://technet.microsoft.com/en-us/library/ms174396.aspx
http://learningsqlserver.wordpress.com/2011/01/21/what-version-of-sql-server-do-i-have/
SQLSecurity.com http://www.sqlsecurity.com/faqs-1/sql-server-versions/2008-r2

PowerShell 要如何與 SQL Server 配搭?

首先,就以文章標題來探討,PowerShell 是不是可以和 SQL Server 整合,配搭在一起使用?
答案:Yes。

接下來是要如何使用呢?

你是可以在 SQL Server 環境中,執行、使用 PowerShell。共有四種方法:

  • 使用 SQLPS.exe 工具程式
  • 在 SQL Server Management Studio 環境中,指定需處理物件後,按右鍵 / PowerShell。
  • SQL Server Agent Job 中,Agent Job 的形態(Type)設定,就可以指定為 PowerShell。
  • 若是已在 PowerShell 的環境中,還可以再載入 PowerShell provider 進來,以增強功能。

 

使用 SQLPS.exe 工具程式,需了解:

  1. SQLPS 工具程式,需要將該程式的存放路徑設置到環境變數 PATH 中。
  2. 32位元電腦, SQLPS.exe 存放位置: \Program Files\Microsoft SQL Server\100\Tools\Binn
  3. 64位元電腦, SQLPS.exe 存放位置: \Program Files (x86)\Microsoft SQL Server\100\Tools\Binn

Login SQL Error–18486

在登入 SQL 資料庫時,發生系統報錯誤訊息,
Error: 18486 Login failed for user 'sa' because the account is currently locked out. The system administrator can unlock it.


錯誤排除:
方法ALTER LOGIN sa WITH PASSWORD = ‘yourpass’ UNLOCK;
GO


當然,你可以修正系統 Policy 設定,避免日後再發生此事。
ALTER LOGIN sa WITH CHECK_POLICY = OFF;
ALTER LOGIN sa WITH CHECK_POLICY = ON;

如何更改SQL Server中,默認啟始的數據庫?

MS-SQL Server Management Studio (SSMS) [v2005] provides a way to change this. And next time onwards this nerw selected database will selected by default instead of the MASTER DB.

Steps:

  1. Open Sql Server Management Studio
  2. Go to object Explorer -> Security –> Logins
  3. Right click on the login and select properties
  4. And in the properties window change the default database and click OK.

image
image
image

 

另外,也可以使用指令來操作:


Exec sp_defaultdb @loginame='TestUser', @defdb='Test'



Important: 【使用須知】



This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Use ALTER LOGIN instead.

認識 sp_MSforeachdb

sp_MSforeachdb 是 Microsoft SQL Server 沒有記錄在公開文件中的預儲程序。
在Master資料庫中的系統預儲程序中可以找到這個指令;透過這個指令可以輕鬆取得每一個資料庫的詳細資訊,也可透過這個指令執行資料庫的維護作業。
目前SQL Server 都是透過下列指令,來取得資料庫檔案的相關訊息。 

USE 資料庫名稱
GO
SELECT * FROM sysfiles
GO

其中 sysfiles 資料表:
--在SQL Server 2000中,sysfiles位於每一個資料庫的系統資料表格中
--在SQL Server 2005中,sysfiles位於每一個資料庫的檢視表中的系統檢視表
--在SQL Server 2008中,sysfiles位於每一個資料庫的檢視表中的系統檢視表

使用 master 資料庫,查詢相關的檔案資料訊息
image
如果需要列出資料庫伺服器中所有資料庫的檔案資料訊息,就必須在每個資料庫執行上列指令,而無法在單次查詢中就取得所有訊息,透過sp_MSforeachdb指令可以幫助你將每個資料的訊息彙總起來。

執行sp_MSforeachdb必須提供參數,若未提供錯誤訊息如下所示:
在SQL Server 2008R2中執行sp_MSforeachdb未提供參數的錯誤訊息
image

接著藉由sp_MSforeachdb指令,幫助我們執行指令SELECT * FROM sysfiles,完整指令如下:
--SQL2000、SQL2005、SQL2008、SQL2008R2適用
EXECsp_MSforeachdb 'USE [?];SELECT * FROM sysfiles;'
直接顯示彙總資料庫檔案 2008R2 執行結果
image
原本我們透過指令,只能對單一資料庫進行處理。
USE 資料庫名稱
GO
SELECT * FROM sysfiles
GO

現在 sp_MSforeachdb自動幫我們將個資料庫名稱取代完整指令中的問號,以迴圈的方式列出資料庫伺服器中,目前INSTANCE的所有資料庫檔案詳細資料。
EXEC sp_MSforeachdb 'USE [?];SELECT * FROM sysfiles;'

上列問號可寫成[?]或是?,例子如下:

--SQL2000、SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'SELECT ''?'' AS ''DATABASENAME'''
GO

上例會列出此資料庫伺服器單一INSTANCE中的所有資料庫名稱。
image
執行下列語法可以將資料庫伺服器單一INSTANCE中的所有資料庫檔案訊息彙總到一個暫存資料表。
--SQL2000、SQL2005、SQL2008、SQL2008R2適用
CREATE TABLE #DBInfo ( 
 
fileid smallint,
  groupid smallint,
  size bigint,
  maxsize bigint,
  growth float,
  status int,
  perf int,
  name sysname,
  filename sysname );

EXEC sp_MSforeachdb 'USE [?];INSERT #DBInfo SELECT * FROM sysfiles;'
GO

SELECT * FROM #DBInfo
GO

DROP TABLE #DBInfo
GO
彙總資料庫檔案到暫存資料表-V2008R2
image
如有必要可以將上列的暫存資料表改為實體資料表,可用來設計自己的資料庫監控系統,用來觀察與紀錄資料庫的使用狀況。

以下列出sp_MSforeachdb常見的應用
1.列出資料庫實體名稱
--SQL2000、SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'USE [?];EXEC sp_helpfile;'
GO
image


2.顯示資料庫使用的磁碟空間大小
--SQL2000、SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'USE [?];EXEC sp_spaceused;'
GO
image


3.將資料庫的Page_VERIFT選項設定為CHECKSUM
--SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'ALTER DATABASE ? SET PAGE_VERIFY CHECKSUM;'
GO

4. 顯示實體資料檔和記錄檔磁碟空間使用狀況
--SQL2000、SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'USE ?;SELECT @@servername AS ''伺服器名稱'',DB_NAME() AS ''資料庫名稱'',[FileID] AS ''檔案代碼'',
[檔案大小(MB)] = CONVERT(DECIMAL(12,2),ROUND([size]/128.000,2)),
[空間使用大小(MB)] = CONVERT(DECIMAL(12,2),ROUND(fileproperty([name],''SpaceUsed'')/128.000,2)),
[剩餘空間大小MB] = CONVERT(DECIMAL(12,2),ROUND(([size]-fileproperty([name],''SpaceUsed''))/128.000,2)), [Name], [FileName],CONVERT(DATETIME,GetDate(),112) AS ''資料查詢時間''
FROM dbo.sysfiles;'
GO
image


5.顯示資料庫訊息
--SQL2000、SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'USE ?; EXEC sp_helpdb ?;'
GO
image


6.列出所有資料庫名稱
--SQL2000、SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'USE ?;PRINT DB_NAME();'
GO

--SQL2000、SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'SELECT ''?'' AS ''DATABASENAME'''
GO

7.顯示每一個資料庫所有資料表名稱
--SQL2000適用
EXEC sp_MSforeachdb 'USE ?;SELECT @@SERVERNAME AS ''ServerName'',
                           DB_NAME() AS ''DbName'' ,

                           name AS ''TableName''
 
                           FROM sysobjects

                           WHERE (xtype = ''U'')'

GO
image
--SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'USE ?;SELECT @@SERVERNAME + ''.'' +
                                  DB_NAME() + ''.'' +
                                  SCHEMA_NAME(uid) + ''.'' +
                                  name AS ''TableName''
                           FROM sysobjects
                           WHERE (xtype = ''U'')'
GO

--SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'USE ?;SELECT @@SERVERNAME + ''.'' +
                                  Table_CATALOG + ''.'' +
                                  TABLE_SCHEMA + ''.'' +
                                  TABLE_NAME AS ''TableName''
                           FROM information_schema.tables;'
GO

--SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'USE ?;SELECT @@SERVERNAME + ''.'' +
                                  DB_NAME() + ''.'' +
                                  SCHEMA_NAME(schema_id) + ''.'' +
                                  name AS ''TableName''
                          FROM sys.tables;'
GO
image


8.檢查資料庫
--SQL2000、SQL2005、SQL2008、SQL2008R2適用
EXEC sp_MSforeachdb 'DBCC CHECKDB(?);'
GO
image


9.對每一個資料庫執行 DBCC UPDATEUSAGE 作業
--SQL2000、SQL2005、SQL2008、SQL2008R2適用
USE master
GO
EXEC sp_MSforeachdb @command1="print '?' DBCC UPDATEUSAGE (?)"
GO

參考資源:

SQL Server 與 CLR 的整合

SQL Server 的設定環境中,是默認不啟用 CLR 功能,如此 user assemblies 的功能,就不能被使用在 SQL Server。

若是在使用,則必須激發 clr enabled。

啟用 CLR 的步驟如下:
sp_configure 'show advanced options',1
GO
reconfigure
GO
sp_configure 'clr enabled',1
GO
reconfigure
GO

insufficient system memory in resource pool 'internal'

使用 SQL 2008 環境,執行 Jobs 作業,卻發現到有些 Jobs 記錄有回報錯誤,經查明後,得知有錯誤訊息:
Executed as user: TPDB01\sqladmin. There is insufficient system memory in resource pool 'internal' to run this query.

這個錯誤只要造成的原因,是系統的"策略"(Policy) 設定不正確所致。

以下設定步驟,可供參考。

  • 在“開始/執行”中輸入“gpedit.msc”
    clip_image002
  • 找到 “鎖定記憶體分頁 Lock pages in memory”, 并設置其 “內容”
    image
  • 添加 使用者
    image
  • 找到sqladmin, 點擊 “確定”
    image
    image
  • 點擊 “確定” 繼續
    image
  • 點擊 “確定” 完成設置
    image
  • 結果如下圖
    image

Single-User / Multi-User 切換

使用 SQL 2008 環境,想到將資料庫設定為 Single User 模式,反之,要設為多人使用 的 Multi User 模式,該如何處理?

設定為 Single User
USE master;
GO
ALTER DATABASE DBWorks2012
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO

設定為 Multi User
USE master;
GO
ALTER DATABASE DBWorks2012
SET MULTI_USER;
GO

另外,也可以藉由下列指令,來設定 唯讀/讀寫 (READ_WRITE)
ALTER DATABASE DBWorks2012 
SET READ_ONLY; 
GO

資料相互串連,預防誤刪的機制

在資料庫的領域中,含括著眾多的資料數據,可能彼此間沒有關係,也可能存在著彼此相依的關係。
為了,防止資料可能會不慎被刪除,所以會應用一些機制來防呆。

方法有:在資料表中,設定 Trigger !!
例如:
Create TRIGGER as01h_deleteYN
ON as01h
FOR DELETE
AS

select b.as_no from deleted  b
where b.as_no in
(
    select a.as_no
        from as03d1 a(nolock)       
            where a.as_no=b.as_no and a.as_serno=b.as_serno
)
if @@ROWCOUNT  <>0
BEGIN
   RAISERROR ('該列帳資料已有提折舊不可刪除', 16, 1)
   ROLLBACK TRANSACTION
END

SQL刪除欄位時的問題

使用 SQL 指令來增加欄位的方法,有:

  • ALTER TABLE ate08h ADD tb_limit decimal (26,4)
  • ALTER TABLE ate08h ADD tb_limit decimal (26,4) Not Null constraint D08htb_limit Default (0)

 

使用 SQL 指令來刪除欄位的方法,有:

  • ALTER TABLE ate08h DROP COLUMN tb_limit

 

但是,在用 Drop Column 指令時,卻發生了下列錯誤:

Server: Msg 5074, Level 16, State 1, Line 1
The object 'D08htb_limit' is dependent on column 'tb_limit'.
Server: Msg 4922, Level 16, State 1, Line 1
ALTER TABLE DROP COLUMN tb_limit failed because one or more objects access this column.

這錯誤說明的Drop Column 時,要刪除的該欄位有 D08htb_limit CONSTRAINT 的限制,所以無法正常刪除 !




對於要刪除有設定 CONSTRAINT 的欄位,需要先刪除 CONSTRAINT 設定,才可以再刪除該欄位。
如:
ALTER TABLE ate08h DROP CONSTRAINT D08htb_limit
ALTER TABLE ate08h DROP COLUMN tb_limit

SQL 恢復報錯:SQL-MDO (ODBC SQLState:42000) 3724

在運作備份資料庫的恢復過程中,發生下列錯誤:

image 

image

上述錯誤造成的原因,主要是在恢復資料庫的過程中,不正常中斷恢復動作,加上恢復的資料庫本身具有”資料同步”的設定。

所以,該資料庫在 SQL 中的記錄,仍被視為”同步”狀態。
需用下列  SQL 指令,查詢其狀態,並修正之:即可正常刪除之。

(以 sa 身份登錄到 SQL Server,在 Master 資料庫中執行)

select category,*
-- update a set category = 0
from master..sysdatabases a where name='IEDB01'

 

應當這樣勞苦,扶助軟弱的人,又當記念主耶穌的話,說:『施比受更為有福。』

奇怪的資料庫問題

原本已在工作環境中,運行多年的一個 SQL 程式,日前卻莫名其妙的無法正常運作。(查不出資料來)

原來的 SQL 程式:
SELECT a.cu_no,a.sa_ivno,a.sa_date,a.od_id,a.sa_amt,a.ie_user,a.ie_lymd,a.od_satyp,b.cu_snam,a.cu_ar
FROM TableA a
INNER JOIN TableB b ON a.cu_sale=b.cu_sale
WHERE sa_date<=getdate()-1 and sa_amt>0 and
sa_ivno NOT IN (SELECT sa_invoice FROM TableC)
ORDER BY sa_date,cu_no,sa_ivno;

經過多方的查找,才找到真正問題的原由;主因是資料數據含有 Null
如果只單純修正含 Null 值的資料,就只能改正現在的問題;但日後若是再發生 Null 情形,也會再產生查不到資料的現象。

所以需要重新修正原程式,以避免日後再發生 Null 的情形。
新修正程式如下:
SELECT a.cu_no,a.sa_ivno,a.sa_date,a.od_id,a.sa_amt,a.ie_user,a.ie_lymd,a.od_satyp,b.cu_snam,a.cu_ar
FROM TableA a
INNER JOIN TableB b ON a.cu_sale=b.cu_sale
WHERE sa_date<=getdate()-1 and sa_amt>0 and
not exists(select 1 from TableC c (nolock) where a.sa_ivno=c.sa_invoice)
ORDER BY sa_date,cu_no,sa_ivno;

要如何取得 MS-SQL 資料表的結構訊息?

要得知資料表的結構訊息,可以用 sp_columns 'Table_Name'   這是在 Query Analyzer 中運行。

若是要在 程式中 來取得相關表結構訊息,則要配合 syscolumns 、sysobjects 或是 syscolumns 及object_id()。

方法一:
select  a.*  from syscolumns a
left join sysobjects b on a.id=b.id
where b.name='Table_Name'

方法二:
select * from syscolumns where id=object_id('Table_Name')

其中有些欄位意義如下:
name  : 欄位的名稱
xtype  : 用以表示欄位的資料型態,可參考文章:SQL 系統資料表 syscolumns 的 xtype 數據意義?
length : 表示該欄位的寬度

SQL 系統資料表 syscolumns 的 xtype 數據意義?

SQL 系統資料表 syscolumns 記錄得資料庫中,所有被建置的資料表最重的訊息。
諸如:欄位名稱、寛度、資料型態…等。

其中,用以表示欄位的資料型態,是被呈現在 xtype 欄位中。但該欄位是以數字值來表示。
該如何得知該數字的含義?

事實上,相關資料是存放在 systypes 資料表中。

select * from systypes
order by xtype

------------------------------------------------------------
34    image
35    text
36    uniqueidentifier
48    tinyint
52    smallint
56    int
58    smalldatetime
59    real
60    money
61    datetime
62    float
98    sql_variant
99    ntext
104    bit
106    decimal
108    numeric
122    smallmoney
127    bigint
165    varbinary
167    varchar
173    binary
175    char
189    timestamp
231    sysname
231    nvarchar
239    nchar
------------------------------------------------------------

一次抓取 MSSQL 數據資料的意外

在學習 PHP & 使用 Eclipse 的過程中,曾記錄下一篇心得文章:PHP PDO 連接 MSSQL 資料庫遇見過的問題

依著那些自信,還以為日後抓取數據庫資料可能會一帆風順,不料短短一天,就破功了。 #$%#$%…

使用如下的程式碼:(截錄)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
<title>IEDB01-iepa00h</title>
</head>
<body>

<?php
try
{
    define(sp, '&nbsp;');
    // 設定 MSSQL 資料庫的 DSN
    $dsn = 'mssql:host=localhost;dbname=DB01;';
    $user = 'sa';
    $password = 'DB20120604';
    // 建立 PDO 物件
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

卻產生下面的中文亂碼情形 !!

image

心中真是 ⅩⅩ○○…
明明同樣的程式,之前是可以正常運作了,怎會今天就停擺?

心有不干,不把問題找出來,那會心安?
於是,重新再從資料庫、字碼的設定及抓資料的程式碼存檔等方面找起,一切多符合先前所列的規則。
最後,只能比較不可正常運行及可正常運行程式檔案的大小及內容了

結果發現到 不可正常運行 與 可正常運行 的檔案,有差異。
不可正常運行的檔案會比可正常運行的檔案多出 3 Bytes

有的這樣的發現,就好辦了;接下來就是 Hex 的比對。
不可正常運作:
image

可正常運作:
image 

哦,這下明白了。

EF BB BF 這三碼不就是 Unicode 的 BOM 嗎?(可參考文章)

補充說明:
要去除多餘的 3 Bytes 資料,可以使用 PSPad 工具程式開啟該檔案,重新設定檔案的格式並存檔,即可解決問題。
image

至于,為什麼會產生 3個多餘的字元,就只能等以後有空再查證了。

願這篇文章能對你有所助益 !!  ( 神:願你平安 )