1判斷一個表或視圖是否在 數據庫中
if exists (select * from sysobjects where name='v1' and xtype='V')
drop view v1
go
sysobjects是一個系統表,如果判斷對象是table,則xtype='U'
如果是trigger則xtype='TR'
2用sql建立交叉表
一個常見的例子
http://iouniuniu.cnblogs.com/archive/2005/10/24/5238.html
有時候需要將結果旋轉以便在水平方向顯示列,水平方向顯示行,即所謂的交叉表(PrvotTable)。在SQL顯示它也比較的簡單:
1:結果確定的交叉表:
Year Quarter Amount(表Prvot)
---- ------- ------
1990 1 1.1
1990 2 1.2顯示成:Year Q1Q2Q3 Q4
1990 3 1.3------------ ------
1990 4 1.41990 1.1 1.21.3 1.4
因為Quarter是固定的,姑且稱其為結果確定的交叉表吧。實現的方法如下:
SELECT Year,
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROMPrvot
GROUP BY Year(具體參考SQL的幫助,搜索交叉數據表即可)
2:結果不確定的交叉表:
假如Quarter是動態的變動的,那么就不能簡單的使用上述的case...when了,可以構造動態的SQL語句,來實現上述的SUM語 句。
declare @goodscode varchar(20)
declare @goodsname varchar(40)
declare @str varchar(2000)
set @str = ''
declare goods_cur cursor for
select goodscode,goodsname
from pub_goods
order by goodscode
open goods_cur
fetch next from goods_cur into @goodscode,@goodsname
while @@fetch_status = 0
begin
set @str = @str + 'sum(case goodscode when ''' + @goodscode + ''' then targetqty else 0 end) as ''' + @goodsname + ''','
fetch next from goods_cur into @goodscode,@goodsname
end
close goods_cur
deallocate goods_cur
set @str = substring(@str,1,len(@str)-1)
exec('select districtcode,' + @str + ' from ( select distinct districtcode,goodscode,targetqty from report_hospital_use where
districtcode is not null ) as t group by districtcode')
3:現在的問題是,能不能不使用游標來實現上述的SUM語句的構造過程。
一個更復雜的例子(待補充)
4在表的定義中,可以定義一種字段(列) ,該類字段的時間是通過其他字段的計算來獲取的,在sql server的文檔中稱為 計算列computed column
該字段的定義是一個表達式,在sql中表達為
f1 as f2+f3+f4,在可視化建表的過程中在屏幕下面的‘公式’里面設置f2+f3+f4
表達式以其他非計算列為參數,還包括常量,還可以使用系統函數。不能引用其他表的列或使用子查詢,不能在主健,唯一健,外健,另一個列的default子句中使用計算列。
計算列不能直接修改或插入,而是計算得到的。
視圖是實現列的首選(?)
5時間,日期的相關計算
CONVERT(nvarchar(10),count_time,121): CONVERT為日期轉換函數,一般就是在時間類型(datetime,smalldatetime)與字符串類型(nchar,nvarchar,char,varchar)相互轉換的時候才用到的函數.3個參數,第1個參數為,轉換后的大小,第2個為,轉換日期的字段或函數,第3個為轉換的格式:
- | 0 or 100 | mon dd yyyy hh:miAM(或PM)
-------------------------------------------------------------------------------------------------
1 | 101 | mm/dd/yy
-------------------------------------------------------------------------------------------------
2 | 102 | yy-mm-dd
-------------------------------------------------------------------------------------------------
3 | 103 | dd/mm/yy
-------------------------------------------------------------------------------------------------
4 | 104 | dd-mm-yy
-------------------------------------------------------------------------------------------------
5 | 105 | dd-mm-yy
-------------------------------------------------------------------------------------------------
6 | 106 | dd mon yy
-------------------------------------------------------------------------------------------------
7 | 107 | mon dd,yy
-------------------------------------------------------------------------------------------------
8 | 108 | hh:mm:ss
-------------------------------------------------------------------------------------------------
- | 9 or 109 | mon dd yyyy hh:mi:ss:mmmmAM(或PM)
-------------------------------------------------------------------------------------------------
10 | 110 | mm-dd-yy
-------------------------------------------------------------------------------------------------
11 | 111 | yy/mm/dd
-------------------------------------------------------------------------------------------------
12 | 112 | yymmdd
-------------------------------------------------------------------------------------------------
- | 13 or 113 | dd mon yyyy hh:mi:ss:mmm(24小時制)
-------------------------------------------------------------------------------------------------
14 | 114 | hh:mi:ss:mmm(24小時制)
-------------------------------------------------------------------------------------------------
- | 20 or 120 | yyyy-mm-dd hh:mi:ss(24小時制)
-------------------------------------------------------------------------------------------------
- | 21 or 121 | yyyy-mm-dd hh:mi:ss:mmm(24小時制)
-------------------------------------------------------------------------------------------------
例子:select convert(char(10),getdate(),120)
結果:2006-08-25
另外,關于時間,日期的計算還有year(),month(),dateapart,等在sql server中查找時間函數可以查到更多函數。
6獲取表中所有列的名字
select name from syscolumns where id = object_id('yourTableName');
但是這樣獲得的結果是按name的字母排序的,所以為了按設計時的順序獲得列名,應該
select name from syscolumns where id = object_id('yourTableName') order by colorder
7關于元數據函數的問題
元數據函數返回有關數據庫和數據庫對象的信息。
所有元數據函數都具有不確定性。每次用一組特定的輸入值調用它們時,所返回的結果不總是相同。
8錯誤:備份集中備份的數據庫與現有數據庫 ‘xxx’不同
還原是看一下“選項”--“將數據庫文件還原為:”列表里各文件的“物理文件名”由于原來的機器上的安裝目錄和你的機器可能不同,要改一下。例如:Z:/Program Files/Microsoft SQL Server/MSSQL/data/xxx.ldf 改為 D:/Program Files/Microsoft SQL Server/MSSQL/data/xxx.ldf
選上“在現有數據庫上強制還原”
9打不開企業管理器
http://www.devdao.com/article/339595.html
癥狀: windows2003系統,點擊sql server 2000 企業管理器.結果出現警告框說MMC cannot open the file "C:/Program Files/Microsoft SQL Server/80/Tools/Binn/sql server enterprise manager.msc",...
解法: 刪掉C:/Documents and Settings/YourUserName/Application Data/Microsoft/MMC/SQL Server Enterprise Manager
備注: 這只是對我適用的解決辦法.還可能是權限等問題.
10將foxpro的dbf數據文件轉換為ms sql的表
http://www.xiaoa.net/DBF/SQL/32/Server/32/286007
--如果TableName 不存在
Select * Into TableName from openrowset('MICROSOFT.JET.OLEDB.4.0'
,'dBase 5.0;DATABASE=D:/','select * from [TEST.DBF]')
--如果TableName 存在
Insert TableName Select * from openrowset('MICROSOFT.JET.OLEDB.4.0'
,'dBase 5.0;DATABASE=D:/','select * from [TEST.DBF]')
問題:如果將本地的dbf轉換到遠程的sql服務器中時,出錯!
11 將表在兩個數據庫服務器間轉移
有個本地數據庫服務器,一個注冊在本地的遠程數據庫服務器,要在兩個服務器間轉移表,最簡單的方法是用sql server自帶的導出數據功能(導入也可以。)。
12 日期時間數據有三種格式,
日期的輸入格式很多大致可分為三類
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
