目前分類:SQL (14)

瀏覽方式: 標題列表 簡短摘要

EX : Select Right('00000000' + Cast(123 as varchar),8)  > '00000123'

 

參考自 : The Will Will Blog
http://blog.miniasp.com/post/2010/05/T-SQL-Tips-Fixed-Length-Number-with-Zero-Padded.aspx

felixhuang 發表在 痞客邦 留言(0) 人氣()

SQL Server 本機用 Enterprise Manager  用 工具->選項->進階,加大逾時秒數。

或是用指令

USE master
GO
EXEC sp_configure 'remote query timeout', 1200
GO
RECONFIGURE
GO

1200 代表的是秒(SQL Server預設是 600 秒,),設為0表示永不愈時。

felixhuang 發表在 痞客邦 留言(0) 人氣()

想把Select的資料,直接轉換成Insert的SQL語法,到另一台電腦的DB執行嗎? 可以使用免費的工具程式 SQL Dumper

比如 : Select * From Table1 直接轉成 =>
         Insert Into Table1('A1','A2','A3',....)
         Insert Into Table1('B1','B2','B3',....)
         Insert Into Table1('C1','C2','C3',....)
         ........

SQL Dumper

 

SQL Server Dumper 下載官網 : http://www.ruizata.com/

felixhuang 發表在 痞客邦 留言(0) 人氣()

IF EXISTS (SELECT * FROM Table1)
BEGIN

     ...............

END

ELSE
BEGIN

     .............

END

felixhuang 發表在 痞客邦 留言(0) 人氣()

簡短語法
DUMP TRANSACTION Northwind WITH NO_LOG

 

完整語法
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT

USE Northwind -- 要操作的資料庫名
SELECT @LogicalFileName = 'Northwind_Log', -- 日誌文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 100 -- 你想設定的日誌文件的大小(M)

-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)


DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

 

本文引用 : 藍色小惡魔 http://www.imp.idv.tw/play/forum/viewthread?thread=990

felixhuang 發表在 痞客邦 留言(0) 人氣()

在一般交易記錄檔中,常有需要同時顯示交易期日最後一筆與上一筆價格,可以參考以下的範例:
 
Select A.PRODUCT_NO,A.PRICE,
LAST_PRICE=CASE WHEN B.PRICE IS NULL THEN 0 ELSE B.PRICE END,
A.OUT_DATE
From PRICE_TABLE A
Left Join PRICE_TABLE B 
 on A.PRODUCT_NO= B.PRODUCT_NO And A.OUT_DATE < B.OUT_DATE 
 And C.OUT_DATE
 =(Select Max(OUT_DATE)  
  From   PRICE_TABLE
  Where  PRODUCT_NO = A.PRODUCT_NO )
Order By A.OUT_DATE

felixhuang 發表在 痞客邦 留言(0) 人氣()

要直接在SQL語法中改變日期格式,Convert() 函式提供了一些方法,加上dateadd(),substring() 可以達成大部份改變日期格式的需求...

假設 getdate() = '2009/4/9'

Select Convert(char(10),getdate(),111)
-- =2009/04/09 (YYYY/MM/DD)

Select Convert(char(6),getdate(),112)  ,
-- =200904 (YYYYMM)

Select Convert(char(8),getdate(),11)
-- =09/04/09 (YY/MM/DD)

Select Convert(char(8),getdate(),12)
-- =090409 (YYMMDD)

Select Convert(Char(08),dateadd(month, 1, getdate()),111) +'01' 
-- =2009/05/01 (下月一號)

Select Convert(char(10),dateadd(day,-day(getdate()),dateadd(month,1,getdate())),111)
-- =2009/04/30(本月月底)(本月最後一天)

select Convert(char(10),dateadd(day,-day(getdate()),dateadd(month,2,getdate())),111)
-- =2009/05/31(下月月底)

Convert 參數查詢列表 

felixhuang 發表在 痞客邦 留言(0) 人氣()

CREATE TRIGGER [tri_TABLE1_INS] ON [TABLE1]
FOR INSERT
AS
INSERT INTO TABLE1_LOG
SELECT 'INS', GETDATE(), * FROM INSERTED
GO
CREATE TRIGGER [tri_TABLE1_UPD] ON [TABLE1]
FOR UPDATE
AS
INSERT INTO TABLE1_LOG
SELECT 'UPD', GETDATE(), * FROM INSERTED
GO

CREATE TRIGGER [tri_TABLE1_DEL] ON [TABLE1]
FOR DELETE
AS
INSERT INTO TABLE1_LOG
 SELECT 'DEL', GETDATE(), * FROM DELETED
GO

felixhuang 發表在 痞客邦 留言(2) 人氣()

一般來說備份DTS的方法有兩種 :
1. 備份 msdb, 但是 SQL Server 版本、定序都要一樣。 (可以用 Select @@version  查版本)
2. 一個個慢慢Save。
不過最佳的方式,還是用免費的 DTSBackup2000 :
DTSBack2000 
操作方式非常簡單,速度又快,而且不會覆蓋原有的DTS....  強力推鑑....

官網 SQLDTS - 有很多有關於DTS 的 Tool

felixhuang 發表在 痞客邦 留言(1) 人氣()

UPDATE table1
      SET table1.col = table2.col1
FROM table2 WHERE table2.oldCol = table1.col

felixhuang 發表在 痞客邦 留言(2) 人氣()

大部份處理資料庫程式的人,都會遇到 Null 的問題,這時候如果在建立Table時,設為 Not Null ,並設定預設值為空白就好了,方法也很簡單,只要在設計預設值(Defaut Value)設為 (''),就可以了.....

ex :
CREATE TABLE [MEMBERS] (
 [FirstName] [varchar] (50) NOT NULL   DEFAULT ('')
)

felixhuang 發表在 痞客邦 留言(1) 人氣()

如果想查詢一段文字有幾個字元,或是想知道實際存放在 Varchar() 欄位裡的資料有多大,len() 是個很好用的函數,直接看範例吧!

ex:

Select len('123 456 789')

Select len(FirstName),FirstName From MEMBERS

felixhuang 發表在 痞客邦 留言(0) 人氣()

以資料表 Employees 為範例的話,在 MS SQL 有下列兩種方式 :

1. Select

select name from syscolumns where id=object_id('Employees')

2. 執行系統預存程序

exec sp_help Employees

felixhuang 發表在 痞客邦 留言(0) 人氣()

假設資料表內有許多重覆的資料欄,但只有日期欄位不同,如果不想用 Group By 一個個分組,要如何列出資料中日期最大的呢?

範例:

Table:Order

ID Title Price Date
1 K1 100 2008/07/01
1 K1 200 2006/11/23
2 B1 300 2008/01/01
3 C2 400 2008/02/02

Select * From Order a Where Date = (Select Max(b.Date) From Order b Where a.ID = b.ID)

結果 :

ID Title Price Date
1 K1 100 2008/07/01
2 B1 300 2008/01/01
3 C2 400 2008/02/02

felixhuang 發表在 痞客邦 留言(5) 人氣()