USE [lenton] GO /****** Object: UserDefinedFunction [dbo].[Split] Script Date: 2014/1/16 下午 02:42:09 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[Split] ( @RowData varchar(8000), @SplitOn nvarchar(1) ) RETURNS @RtnValue table ( Id int identity(1,1), Data nvarchar(100) ) AS BEGIN Declare @Cnt int Set @Cnt = 1
While (Charindex(@SplitOn,@RowData)>0) Begin Insert Into @RtnValue (data) Select Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) Set @Cnt = @Cnt + 1 End
Insert Into @RtnValue (data) Select Data = ltrim(rtrim(@RowData))
微軟在以往SQL 2000時代就有提供北風資料庫(Northwind)供下載測試,安裝方式就不再多說,Google一下就有很多教學,例如此篇文章,而在SQL 2012後安裝後會發現無法附加,微軟又提供另一個範例資料庫叫Adventure Works 範例資料庫,雖然這個資料庫關聯很多,資料表命名也更整齊,但通常會用到範例資料庫應該都只是撰寫些Demo,不希望有太複雜關聯的資料庫吧,故本文章主要教學如何在SQL Server 2012安裝北風資料庫,以LocalDB為例。
以傳統附加方式會發生以下錯誤:
這主要是因為一些相容性問題導致附加失敗,而我們可以用另外一種方式來建立,首先先到從此下載的北風資料庫安裝檔,而預設安裝資料夾為C:\SQL Server 2000 Sample Databases,打開後會有以下檔案,打開instnwnd檔案
將以下兩行程式碼註解並執行
exec sp_dboption 'Northwind','trunc. log on chkpt.','true'
declare @TABLE TABLE (ID int,Title nvarchar(50)) declare @tagetID int
--新增資料 INSERT INTO @TABLE VALUES(1,N'新聞標題1') INSERT INTO @TABLE VALUES(2,N'新聞標題2') INSERT INTO @TABLE VALUES(3,N'新聞標題3') INSERT INTO @TABLE VALUES(4,N'新聞標題4') INSERT INTO @TABLE VALUES(5,N'新聞標題5')
select * from @TABLE
set @tagetID = 3 --抓取ID為3的上下筆
SELECT P.PrevID,P.Name as 'Prev News', N.NextID,N.Name as 'Next News' FROM ( SELECT MAX(A.id) PrevID, (select Title FROM @TABLE where id = MAX(A.id)) Name from @TABLE A where A.id < @tagetID ) P CROSS JOIN ( SELECT MIN(A.id) NextID, (select Title FROM @TABLE where id = MAX(A.id)) Name from @TABLE A where A.id > @tagetID ) N
CREATE FUNCTION [dbo].[Test_Function] (@ID int) RETURNS @TABLE TABLE ( ID varchar(25), Number varchar(25) ) AS BEGIN
IF @ID = 1 begin INSERT INTO @TABLE (ID,Number) select 'ID1','ID Number 1' end else BEGIN INSERT INTO @TABLE (ID,Number) select 'ID2','ID Number 2' end
後來找到微軟有官方的解答(機器翻譯),照他給的Sample Code進行些修改,將定義Table的抽出外層,不同的是,他的Temp欄位只有一個,而我的欄位有非常多所以不可能一個一個宣告,所以我先Select top 0 將欄位INTO到Temp Table,接著再依不同條件Inserty資料,改寫完的Code如下:
-- 如果Temp Table存在,則清除
IF object_id(N'tempdb.dbo.#TempTable') IS NOT NULL drop table TempTable
select TOP 0 * INTO #TempTable from DemoTable
if (1=1)
begin
INSERT INTO #TempTable
select * from DemoTable where ColumnName = 'Filter1'
end
else if (1=2)
begin
INSERT INTO #TempTable
select * from DemoTable where ColumnName = 'Filter2'
end
SELECT * FROM #TempTable
--Do something ....
ASP.NET的GridView是我覺得最方便的Server控制項,在公司內部有很多的報表,主要邏輯都寫在SQL裡面,而在GridView裡就能變得比較單純去繫結資料,並修改一些顯示樣式即可,而小計欄和總計欄又是報表常常會遇到的欄位,本篇文章將Step by Step來實做如何建置這樣的報表。
1.新增一個WebForm,並拉一個GridView控制項至畫面
2.移至設計畫面,選擇GridView屬性,修改ID以便程式好閱讀
select
case when grouping(Dept)=1 then N'合計' else isnull(StaffNumber,'') end '員工編號',
case when grouping(StaffNumber)=1 and grouping(Dept)=0 then N'小計' else isnull(Dept,'') end '部門',
sum(pay) as '年薪'
from GirdTest group by Dept,StaffNumber with rollup
private DataTable GetData()
{
DataTable dt = new DataTable();
string Sql = @"
select
case when grouping(Dept)=1 then N'合計' else isnull(StaffNumber,'') end '員工編號',
case when grouping(StaffNumber)=1 and grouping(Dept)=0 then N'小計' else isnull(Dept,'') end '部門',
sum(pay) as '年薪'
from GirdTest group by Dept,StaffNumber with rollup";
using (SqlConnection connection =
new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(Sql, connection);
try
{
connection.Open();
SqlDataReader reader = command.ExecuteReader();
dt.Load(reader);
reader.Close();
return dt;
}
catch (Exception ex)
{
//Error logging...
}
}
return dt;
}
Could not allocate space for object 'XXX'.'YYY' in database 'distribution' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, addingadditional files to the filegroup, or setting autogrowth on for existing files in the filegroup.