搜尋此網誌

2012年5月21日 星期一

insert into select 及 select into 用法差異

如果今天要寫的目的資料表不存在,可以直接使用 select into 完成,例如
Select Column1, null, 'A', @parameter1, Column2, Column3 Into Table1 From Table2 Where Column1 = 'A' and Column1 = 'B'
如果今天要寫的目的資料表已存在,請使用 insert into select 完成,例如
insert into Table1 Select  Column1, null, 'A', @parameter1, Column2, Column3 From Table2 Where Column1 = 'A' and Column1 = 'B'

2012年5月16日 星期三

如何動態組出 T-SQL 指令

sp_executesql 系統預存程序具備以參數來指定所要執行的 T-SQL,藉由這個特性,可以讓動態組出的 T-SQL 更加安全。


假設我們要動態組出 T-SQL,從 AdventureWorks 資料庫中的 Production.Product 資料表內,找出「顏色」是黑色的產品,可以使用下面的程式碼:


USE AdventureWorks
GO
 
-- 宣告變數
DECLARE @SQLCommand nvarchar(200)
DECLARE @columnList nvarchar(50)
DECLARE @parmColor varchar(10)
 
-- 定義變數
SET @columnList = N'ProductID 產品編號, Color 顏色'
SET @parmColor = 'Black'
 
-- 動態組出 T-SQL
SET @SQLCommand = 'SELECT ' + @columnList + ' FROM Production.Product WHERE Color = @color'
 
-- 執行動態組出的 T-SQL
EXECUTE sp_executesql @SQLCommand, N'@color varchar(10)', @color = @parmColor


執行的部分結果畫面:


從程式碼中,可以看到系統預存程序 sp_executesql 一共需要傳入 3 個參數,分別說明如下:


●第 1 個參數:
所要執行的 T-SQL 陳述式,其內容必須是 Unicode 字串,所以在宣告 @SQLCommand 時,必須指定為 n 開頭的資料型別,在這個範例我是使用 nvarchar 型別。
因為要把英文的欄位名稱改用中文來顯示,所以在定義變數 @columnList 時,要使用前置詞 N 來指定該變數的內容。


●第 2 個參數:
它會包含第 1 個參數中,所有內嵌的參數定義。以本程式碼為例,@color 就是內嵌的參數定義。同樣的,這個參數也必須使用前置詞 N 來指定該變數的內容,且每個參數的定義都是由參數名稱(在該程式碼內,就是 @color)和資料型別(在該程式碼中,就是 varchar(10))所組成。


●第 3 個參數:
指定第 2 個參數內的參數定義的值。以本程式碼為例,第二個參數指定為 @color varchar(10),所以要把先前設定的 @parmColor 的值指派給 @color,這樣才能讓 @parmColor 所代表的 Black 傳遞給 @color。


大家可以跟上一篇分享:「如何動態組出 T-SQL 指令(上)」,比較一下,於設定 @color 顏色變數的值時,上一篇文章在變數值的左右各用了 3 個單引號(')來把 Black 包起來,而在這裡只需要用 1 對單引號就可以了。


如果現在要再加上一個查詢的限制條件,就是「產品編號」要小於 325,就要多宣告並設定一個新變數 @parmPID,同時在系統預存程序 sp_executesql 也要隨之修改:



USE AdventureWorks  
GO  
  
-- 宣告變數  
DECLARE @SQLCommand nvarchar(200)  
DECLARE @columnList nvarchar(50)  
DECLARE @parmColor varchar(10)  
DECLARE @parmPID int  
  
-- 定義變數  
SET @columnList = N'ProductID 產品編號, Color 顏色'  
SET @parmColor = 'Black'  
SET @parmPID = 325  
  
-- 動態組出 T-SQL  
SET @SQLCommand = 'SELECT ' + @columnList + ' FROM Production.Product WHERE Color = @color AND ProductID < @pID'  
  
-- 執行動態組出的 T-SQL  
EXECUTE sp_executesql @SQLCommand, N'@color varchar(10), @pID int',  
                        @color = @parmColor, @pID = @parmPID  



執行結果:


如果不想使用 EXECUTE 或 sp_executesql 來動態組出 T-SQL,可以改用下面的程式碼



USE AdventureWorks  
GO  
  
-- 宣告變數  
DECLARE @parmColor varchar(10)  
DECLARE @parmPID int  
  
-- 定義變數  
SET @parmColor = 'Black'  
SET @parmPID = 325  
  
SELECT ProductID 產品編號, Color 顏色  
FROM Production.Product WHERE Color = @parmColor AND ProductID < @parmPID  

2012年5月11日 星期五

MultiLine TextBox 換行處理


MultiLine TextBox 換行符號: "+Environment.NewLine+"

將textbox值存進資料庫:
string aa = this.TextBox1.Text.Replace(System.Environment.NewLine, "");

即將取代"+Environment.NewLine+"存入資料庫

從資料庫取值到TextBox:

string aa = ds.Tables["dsTableName"].Rows[0][0].ToString();
aa = aa.Replace("
",""+Environment.NewLine+"");
TextBox1.Text = aa;

2012年3月10日 星期六

部署Crystal Report for ASP.NET 2.0


web server要安裝什麼才能正常運作crystal report?

我們在另外一台電腦安裝Web專案時,如果有用到Crystal Report,則必需要在Server端安裝CRRedist2005_x86.msi 及 CRRedist2005_x86_cht.msi 二支檔案。

如果有VS 2005的光碟,則可以選擇自訂安裝來安裝Crystal Report 10

如果沒有光碟,可以使用以下方法完成

1.開啟VS 2005
2.選擇「檔案」-->「新增專案」-->選擇「其他專案類型」-->「安裝和部署」
3.選擇「Web安裝專案」
4.名稱就先取做 "WebSteup1"吧,按下確定產生專案(記一下專案位置)
5.在方案總管選擇專案名稱後按右鍵 -->「屬性」
6.Click「必要條件」,然後打勾 Crystal Report for .NET Framework 2.0
7.重建專案

然後到專案目錄下的Debug\CrystalReports裡,就會看到有二個安裝檔CRRedist2005_x86.msi及CRRedist2005_x86_cht.msi,把這二個檔copy到伺服器裡安裝即可。

測試解法無誤

2012年3月6日 星期二

T-SQL取時間的年月日



經常保存在SQL Server的datetime格式的數據都是帶有時、分、秒等的。但是在頁面讀取的時候,通知只需要年月日,
今天用到的讀取時間年月日的方法如下:
view plaincopy to clipboardprint?
convert(varchar(12),時間列名,111)

如在數據表table1中的列operdate是datetime格式的,需要讀取operdate的年月日的方法就是
view plaincopy to clipboardprint?
select convert(varchar(12),operdate,111) from table1

只抓年、月、日: YEAR(), MONTH(), DAY(); 裡面參數放要抓的時間

-=================================================
--SQL中取得時間的一些技巧
--*********時間精確3毫秒*****************
--================================================ =
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

select DATEDIFF(mm,0,getdate())

SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)


--------------當天半夜---------------------------------- ----------
SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

--------------最後一天---------------------------------- ----------
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())),0)


----------去掉時分秒----------------------------
declare @a datetime
set @a = getdate()
SELECT @a,DATEADD(day,DATEDIFF(day,0,@a),0)

----------顯示星期幾----------------------------
select datename(weekday,getdate())

----------如何取得某個月天數-------------------
declare @m int
set @m=3 --月份
select datediff(day,'2006-'+cast(@m as varchar)+'-15' ,'2006-'+cast(@m+1 as varchar)+'-15')

----------或者使用計算本月的最後一天的腳本,然後用DAY函數區最後一天
SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))

----------判斷是否閏年:------------------------
SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then '平

年' else '閏年' end

select case datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate())+'-02-

01'))
when 28 then '平年' else '閏年' end

----------一個季度多少天------------------------
declare @m tinyint,@time smalldatetime
select @m=month(getdate())
select @m=case when @m between 1 and 3 then 1
when @m between 4 and 6 then 4
when @m between 7 and 9 then 7
else 10 end
select @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'
select datediff(day,@time,dateadd(mm,3,@time))


SELECT CONVERT(VARCHAR(8), DATEADD(m, DATEDIFF(m, '', getdate()), ''), 112) AS [月初]
select CONVERT(VARCHAR(8), DATEADD(m, -3, getdate()), 112) AS [三個月前]

2012年2月14日 星期二

SQL 日期時間轉換 (Convert Date Time to string)


YYYY-MM-DD (2008-06-26):CONVERT(CHAR(10), GETDATE(), 120)
HH:MM:SS:sss (17:24:30):CONVERT(CHAR(8), GETDATE(), 114)
MM DD YYYY (06 26 2008):CONVERT(CHAR(10), GETDATE(), 100)
MM/DD/YYYY (06/26/2008):CONVERT(CHAR(10), GETDATE(), 101)
MM.DD.YYYY (06.26.2008):CONVERT(CHAR(10), GETDATE(), 102)
DD/MM/YYYY (14/03/2011):CONVERT(CHAR(10), GETDATE(), 103)
DD.MM.YYYY (14.03.2011):CONVERT(CHAR(10), GETDATE(), 104)
DD-MM-YYYY (14-03-2011):CONVERT(CHAR(10), GETDATE(), 105)
DD MM YYYY (14 03 2011):CONVERT(CHAR(10), GETDATE(), 106)
YYYYMMDD (20110314):CONVERT(CHAR(8), GETDATE(), 112)
HH:MM:SS:sss (17:24:30:923):CONVERT(CHAR(12), GETDATE(), 114)

2012年1月3日 星期二

ASP呼叫sql server 預存程序參數詳解



語法 Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)

返回值 返回 Parameter 對象。

參數

Name 選用 字串 代表Parameter對象名稱。

Type 選用 數值 指定Parameter對象資料類型。
 adDBTimeStamp 135 日期時間數據類型
 adDecimal 14 十進製整數值
 adDouble 5 雙精度小數值
 adError 10 係統錯誤信息
 adGUID 72 全域性唯一識別字(Globally unique identifier)
 adDispath 9 COM/OLE自動對象(Automation Object)
 adInteger 3 4字節有符號整數
 adIUnknown 13 COM/OLE對象
 adLongVarBinary 205 大型2字節值
 adLongVarChar 201 大型字符串值
 adLongVarWChar 203 大型未編碼字符串
 adNumeric 131 十進製整數值
 adSingle 4 單精度浮點小數
 adSmallInt 2 2字節有符號整數
 adTinyInt 16 1字節有符號整數
 adUnsignedBigInt 21 8字節無符號整數
 adUnsignedInt 19 4字節無符號整數
 adUnsignedSmallInt 18 2字節無符號整數
 adUnsignedTinyInt 17 1字節無符號整數
 adUserDefined 132 用戶自定義數據類型
 adVariant 12 OLE對象
 adVarBinary 204 雙字節字符變量值
 adVarChar 200 字符變量值
 advarchar 202 未編碼字符串變量值
 adWchar 130 未編碼字符串

Direction 選用 數值 指定Parameter為輸入或輸出類型。
 adParamInput 1 允許數據輸入至該參數當中
 adParamOutput 2 允許數據輸出至該參數當中
 adParamInputOutput 3 允許數據輸入、輸出至該參數當中
 adparamReturnValue 4 允許從一子程序中返回數據至該參數當中

Size 選用 數值 指定參數值最大長度(以字符或字節數為單位)。

Value 選用 字串或數值 指定Parameter預設值。

說明
使用 CreateParameter 方法可用指定的名稱、類型、方向、大小和值創建新的 Parameter 對象。在參數中傳送的所有值都將寫入相應的 Parameter 屬性。
該方法無法自動將 Parameter 對象追加到 Command 對象的 Parameter 集合,這樣就可以設置附加屬性。如果將 Parameter 對象追加到集合,則 ADO 將使該附加屬性的值生效。
如果在 Type 參數中指定可變長度的數據類型,那麼在將它追加到 Parameters 集合之前必須傳送 Size 參數或者設置 Parameter 對象的 Size 屬性環裨蚪砦蟆?br>