Category Archives: SQL Server 2005

Team Exploere 2005/2008 與 SQL Server Management Studio 存取 TFS 2010

VS 2008 SP 1 後安裝 Visual Studio Team System 2008 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010 (

Team Explorer 2005/2008 Update for TFS 2010 is Available)

加入 TFS 改以完整網址輸入

image

Team Explorer 2008 即可存取 TFS 2010

若要 SQL Server Management Studio 可以存取 TFS 做 Source Control,需下載安裝

Team Foundation Server MSSCCI Provider 2010

http://visualstudiogallery.msdn.microsoft.com/en-us/bce06506-be38-47a1-9f29-d3937d3d88d6/view/Reviews

image

image

image

image

image

image

image

image

廣告

各種 SQL Server 的工具連結

Free SQL Server tools that might make your life a little easier

將遞迴資料展成樹狀 XML 節點

應朋友的需求,寫了以下的範例

USE tempdb
GO
CREATE TABLE [dbo].[tbOrganization](
    [Orgid] [int] NOT NULL,
    [OrgName] [nvarchar](30) NULL,
    [ParentOrgid] [int] NULL
) ON [PRIMARY]
GO

INSERT tbOrganization VALUES(1,N’A’,NULL),(2,N’B’,1),(3,N’C’,2),(4,N’D’,1),(5,N’E’,4),(6,N’F’,5),(7,N’G’,2),(8,N’H’,1),(9,N’I’,6)
GO

CREATE PROC [dbo].[spXML] @OrgID INT
AS
WITH Hier(Orgid,OrgPath,OrgName,ParentOrgid,Lvl,XMLNode) AS
(
    SELECT Orgid,Convert(varchar(MAX),Orgid)+Convert(varchar(MAX),OrgName) AS OrgPath,
    OrgName,ParentOrgid,1,
    ‘<asp:TreeNode Text="’ + Convert(varchar(MAX),OrgName) + ‘" Value="’ +  Convert(varchar(MAX),OrgName) + ‘">’ AS XMLNode
    FROM tbOrganization
    WHERE OrgID=@OrgID
    UNION ALL
    SELECT s.OrgID,
    OrgPath + " +Convert(varchar(MAX),s.Orgid)+ Convert(varchar(MAX),s.OrgName) OrgPath,
    s.OrgName,s.ParentOrgID,Lvl+1,
    ‘<asp:TreeNode Text="’ + Convert(varchar(MAX),s.OrgName) + ‘" Value="’ +  Convert(varchar(MAX),s.OrgName) + ‘">’ AS XMLNode
    FROM tbOrganization s JOIN Hier h
    ON s.ParentOrgID=h.OrgID
)
SELECT Lvl,XMLNode INTO #tmp FROM Hier ORDER BY OrgPath

DECLARE @xml NVARCHAR(MAX)=N'<asp:TreeView ID="TreeView1" runat="server" xmlns:asp="test"><Nodes>’
DECLARE cur CURSOR FAST_FORWARD
FOR SELECT * FROM #tmp
DECLARE @Lvl INT=1,@PreLvl INT=1,@Count INT,@Node NVARCHAR(1000)
OPEN cur
FETCH NEXT FROM cur INTO @Lvl,@Node
WHILE @@FETCH_STATUS=0
BEGIN
       SET @xml+=@Node
       SET @PreLvl=@Lvl
       FETCH NEXT FROM cur INTO @Lvl,@Node
       IF @Lvl=@PreLvl
        SET @xml+=N'</asp:TreeNode>’
       IF @Lvl<@PreLvl
       BEGIN
        SET @Count=@PreLvl-@Lvl
        WHILE @Count>=0
        BEGIN
            SET @xml+=N'</asp:TreeNode>’
            SET @Count-=1
        END
       END   
END
CLOSE cur
DEALLOCATE cur
WHILE @PreLvl>1
BEGIN
    SET @xml+=N'</asp:TreeNode>’
    SET @PreLvl-=1
END
SET @xml+='</Nodes></asp:TreeView>’
SELECT @xml

–測試用,可以刪除
SELECT CONVERT(XML,@XML)
GO
–測試
EXEC spXML 1
EXEC spXML 3

執行結果如下

image

哇,拼金氏世界紀錄嗎?

一篇討論用 traceflag  3226 停掉執行成功訊息的 Blog

https://blogs.msdn.com/sqlserverstorageengine/archive/2007/10/30/when-is-too-much-success-a-bad-thing.aspx

它的回應比較誇張…一個 Server 上有超過 6500 個 DB,不知用途為何?

 

另一個回應的 Script 還不錯:)

http://sqlblog.com/blogs/andrew_kelly/archive/2007/10/29/successful-backup-messages-no-more.aspx

 

 

 

 

這次來聽課的朋友中,有兩位服務的公司都是 SAP on SQL Server,我聊到之前玩 Oracle ERP 的同事告訴我,他們所用的 Oracle ERP 有 4 萬多個 Table 和 View,結果今天來的朋友說,他們的 SAP 有 6 萬多個 Table,哇…

另一位朋友說,她們公司每年要付給 SAP 約 1 千 7 百萬的維護費…哇

Itzik Ben Gan 的數列產生器

用這個技巧完成以下需求

這邊有一個SQL的問題,不知道你是否可以幫忙解決,

我這有一個Table如下表示
ColumnA   ColumnB
A1              3
A2              2
A3              4

我相望可以Select出
A1   1
A1   2
A1   3
A2   1
A2   2
A3   1
A3   2
A3   3
A3   4

這樣的資料

我的解法

CREATE FUNCTION fnGets(@top BIGINT) RETURNS @t TABLE(SeqNo BIGINT) AS BEGIN  WITH Nbrs_3( n ) AS ( SELECT 3 UNION ALL SELECT 2 UNION ALL SELECT 1 UNION ALL SELECT 0 ),  Nbrs_2( n ) AS ( SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ),  Nbrs_1( n ) AS ( SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ),  Nbrs_0( n ) AS ( SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ),  Nbrs ( n ) AS ( SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 )  INSERT @t SELECT k  FROM ( SELECT ROW_NUMBER() OVER (ORDER BY n)  FROM Nbrs ) D ( k )  WHERE k <= @top ;  RETURN END go

with ddt(a, b) as ( select * from (values (‘a’, 2),(‘b’,32768),(‘c’,1234)) ddt (a, b) ) select a,f.*  from ddt cross apply fnGets(b) f ORDER by 1,2

果然有趣,稍微修改如下:

CREATE PROC spGets(@top BIGINT)
AS
WITH Nbrs_3( n ) AS ( SELECT 3 UNION ALL SELECT 2 UNION ALL SELECT 1 UNION ALL SELECT 0 ),
Nbrs_2( n ) AS ( SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ), –4^2
Nbrs_1( n ) AS ( SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ), –4^2^2
Nbrs_0( n ) AS ( SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ), –4^2^2^2
Nbrs ( n ) AS ( SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 )   –4^16 = 4294967296
SELECT k
FROM ( SELECT ROW_NUMBER() OVER (ORDER BY n)
FROM Nbrs ) D ( k )
WHERE k <= @top ;
GO
exec spGets 100

–4 顆 CPU 幾乎滿載
WITH Nbrs_3( n ) AS ( SELECT 3 UNION ALL SELECT 2 UNION ALL SELECT 1 UNION ALL SELECT 0 ),
Nbrs_2( n ) AS ( SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ), –4^2
Nbrs_1( n ) AS ( SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ), –4^2^2
Nbrs_0( n ) AS ( SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ), –4^2^2^2
Nbrs ( n ) AS ( SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 )   –4^16
SELECT COUNT_BIG(*) FROM Nbrs

小心,若擴大 scale,極耗資源

SSIS 的 Foreach Loop 會將 3 個字以上的附檔名弄錯

俊宇提醒 SQL Server 2005 SSIS 的 Foreach Loop 會將 3 個字以上的附檔名弄錯,經測試,果然如此

image

結果 *.txt* 都會符合 目瞪口呆

但這不是什麼大問題,我直覺的解法如下,或許不完善,但還蠻簡單的:

image

在真正要工作的 Task 加一個 Script Task,透過 script task 取得副檔名長度,再以 Prededence Constraint 來決定是否要執行該迴圈原本要執行的邏輯

Script Task 的設定如下:

image

透過 VB.NET 取得副檔名長度:

Dts.Variables("i").Value = Dts.Variables("strFile").Value.ToString().Length – Dts.Variables("strFile").Value.ToString().LastIndexOf(".") – 1

而後透過 Precedence Constraint 來限制真正要執行的 Task 是否在該次檔案動作

image

謝謝俊宇的提醒微笑

SQL Server 2008 正式版可以從 MSDN、TechNet 下載了!!!

但…我找不到繁體中文版傷心

看來,SQL Server 2008 安裝程式附的是 .NET Framework 3.5 SP1 正式版微笑

 

 

 

 

最後妥協了,先裝 180 天的中文測試版好了,但…其內沒有 Visual Studio 2008 的 SP1,而我在 VPC 內先裝好了 VS 2008,在 SQL 2008 安裝檢查時,居然因為 VS 2008 沒有 SP1 而無法安裝,但又找不到 VS 2008 SP1 的正式版…看來,暫時這兩個產品不能裝在同一台機器上了…

結果現在測試都需要用兩台,一台跑 SQL Server 2008,另一台跑 VS 2008 + SP1 Beta

…唉,每隔一陣就要被 Beta 搞一段時日…

View 是否會記住欄位細節定義

上課時,工研院的朋友詢問 View 是否會記住欄位細節定義,我的印象是 SQL 會記得欄位名稱數量,但不會記細節,後來才發現自己錯了,我做了如下的驗證

create table tbCust(PK INT IDENTITY(1,1) PRIMARY KEY,
CustomerID NVARCHAr(5),
CompanyName NVARCHAR(40),
ContactName NVARCHAR(30))

CREATE VIEW vwCust
AS
SELECT CustomerID,CompanyName,ContactName FROM tbCust

驗證內容
sp_help ‘vwCust’
image

或另一種驗證方式:
select * from sys.all_columns where object_id=object_id(‘vwCust’)
image

再修改 Table 定義後,重新查 View,其欄位細節維持舊定義。

玩了十多年的 SQL Server,直到今天才發現自己的基本認知錯誤 害羞

謝謝工研院朋友們提出的好問題

宣告一個變數 (Ex: declare @para) ,會採用DB Server的collation, 還是使用 DB 的 collation setting

朋友的問題,而我的測試如下:
 

宣告變數時,連接當下落在哪個 DB,就用該 DB 所定義的 Collation ,但在比較時,可以直接指定 collate,而不管預設的 collate

 

SELECT *

FROM fn_helpcollations() where name like ‘Chinese_Taiwan_Stroke%’

 

create database db1 collate Chinese_Taiwan_Stroke_BIN

go

create database db2 collate Chinese_Taiwan_Stroke_CI_AI

GO

 

use db1

go

declare @c nvarchar(1),@b bit

set @c=’a’

if @c=’A’  分大小寫

        select ‘不分大小寫

else

        select ‘分大小寫

 

你可以在比較的地方指定 collate ,不管是 where if

if @c=’A’ collate Chinese_Taiwan_Stroke_CI_AI

        select ‘不分大小寫

else

        select ‘分大小寫

go

 

use db2

go

declare @c nvarchar(1),@b bit

set @c=’a’

if @c=’A’  不分大小寫

        select ‘不分大小寫

else

        select ‘分大小寫

go

 

USE Master

GO

DROP DATABASE db1,db2

Bob Beauchemin 對 Linq TO SQL 和 Entity Framework 的疑慮