常用SQL

1.建立索引

  create [UNIQUE or CLUSTERED or NONCLUSTERED] index index_name on table(column,...)

  2.建立unique,clustered,nonclustered,primary key 約束

  alter table tablename add

  constraint constraint_name [unique or clustered or nonclustered or primary key] (conlumn,...)

  注:primary key 約束,默認爲索引

  3.建立Foreign key約束

  alter table tablename (with nochek) add

  constraint constraint_name foreign key(conlumn,...) references anothertable(conlumn,...)

  anothertable(conlumn)爲參照的主鍵

  4.建立check約束/default約束

  alter table tablename add

  constraint constraint_name Check(condition)

  alter table tablename add

  constraint constraint_name default 'default_value' for conlumn_name

  5.刪除約束

  sp_helpconstraint table_name 查看一個表中的約束情況

  alter table table_name drop constraint constraint_name 刪除約束

  6.刪除索引

  sp_helpindex table_name 查看錶中索引情況

  drop index table_name.index_name 刪除索引

  7.恢復備份

  restore database putonrecord from disk= 'f:/putonrecord(完全).dat' with norecovery

  restore database putonrecord from disk= 'f:/putonrecord.dat' with recovery

  restore database DBname from disk= 'c:/DBname.bak'

  WITH recoverty,

  MOVE 'OnSouth_Data' TO 'd:/DBname.mdf',

  MOVE 'OnSouth_Log' TO 'e:/DBname.ldf'

  RESTORE LOG MyNwind FROM MyNwindLog1 WITH NORECOVERY

  RESTORE LOG MyNwind FROM MyNwindLog2 WITH RECOVERY, STOPAT = 'Apr 15, 1998 12:00 AM'

  --追加備份的恢復方法

  restore HEADERONLY from disk='c:/bak/bak.dat' --記錄一下position的值

  restore database from disk='c:/bak/bak.dat' with file=Position的值

  8.察看備份文件信息

  restore FILELISTONLY from disk='f:/stat/stat'

  restore HEADERONLY from disk='f:/stat/stat'

  restore LABELONLY from disk='f:/stat/stat'

  restore VERIFYONLY from disk='f:/stat/stat'

  --驗證備份但不還原備份。檢查備份集是否完整以及所有卷是否都可讀。但是,RESTORE VERIFYONLY 不嘗試驗證備份卷中的數據結--構。如果備份有效,則返回"該備份集有效"。

  9.導入/導出

  BULK INSERT DB..TableName FROM 'd:/trvca.txt' with (fieldterminator='|',rowterminator='|/n')

  --Output to XLS

  exec master..xp_cmdshell 'bcp gtdjgl.dbo.gtdj out c:/a.xls -c -q -S"(local)" -U"sa" -P"sunny"'

  --Output to XLS with queryout

  exec master..xp_cmdshell 'bcp "select qymc from sydjgl.dbo.qydj" queryout c:/a.xls -c -q -S"(local)" -U"sa" -P"sunny"'

  --Input from XLS

  exec master..xp_cmdshell 'bcp gtdjgl.dbo.gtdj in c:/a.xls -c -q -S"(local)" -U"sa" -P"sunny"'

  SELECT * into newtable

  FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

  'Data Source="c:/xyz.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...sheetname$

  --讀取txt文件

  SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0', 'Text;Database=E:/;' , 'SELECT * FROM aa#txt')

  --將sql文件導入

  osql -U 用戶名 -P 密碼 -i c:/**1.sql

  10.查看索引情況

  select table_Name=sysobjects.Name ,

  index_Name=sysindexes.Name,

  Type=sysobjects.type,

  分配索引頁=sysindexes.reserved,

  使用索引頁=sysindexes.used,

  葉子層頁=sysindexes.Dpages,

  非葉子層頁=sysindexes.used-sysindexes.Dpages,

  rows=sysindexes.rowcnt

  from sysindexes left outer join sysobjects on sysindexes.id=sysobjects.id

  where sysindexes.indid>0 and sysindexes.indid<255 and sysindexes.status & 64=0

  --若發現非葉子層的頁數爲負數,最好是運行DBCC UPDATEUSAGE ('dbname','tbname','ixname')來更新一下sysindexes的信息

  注意indid列的取值

  1 = 聚集索引

  >1 = 非聚集

  255 = 具有 text 或 image 數據的表條目

  11.查看錶鎖情況

  if object_id('tempdb..#lock')>0

  drop table #lock

  go

  create table #lock(

  spid int,

  dbid int,

  ObjId int,

  IndID int,

  Type varchar(10),

  Resource varchar(100),

  Mode varchar(10),

  Status varchar(10)

  )

  insert into #lock exec sp_lock

  select dbName=d.Name,ObjName=o.Name,l.* from master..sysdatabases D,#lock L,sysobjects O

  where D.dbid=L.dbid and O.ID=L.ObjID

  12.消除孤立用戶

  exec sp_addlogin 'LoginUser'

  use db

  go

  exec sp_grantdbaccess 'LoginUser','db_User' --在當前數據庫中添加帳戶(public)

  use db

  go

  exec sp_revokedbaccess 'LoginUser' --從數據庫中刪除帳戶

  use db

  go

  exec sp_grantdbaccess 'LoginUser' --重新爲數據庫添加賬號

  或者

  use db

  go

  sp_change_users_login 'Report' --顯示存在孤立用戶的數據庫帳號

  sp_change_users_login 'Auto_Fix','sameName' --將數據庫帳號='sameName'與登陸帳號='sameName'的建立連接

  sp_change_users_login 'Update_One', 'dbUser', 'LoginUser' --將db數據庫帳號dbUser與登陸帳號LoginUser建立連接

  或者

  用dts來導入帳號信息:

  [在源數據庫上新建一個包

  然後將“傳輸登陸任務”從左邊工具欄的 拖到右邊框裏

  在彈出的框中設置相應的登錄信息,最後運行包即可]

  或者

  bcp master..syslogins out localpath/syslogins.dat /N /S current_primary_servername /U sa /P sa_password

  EXEC xp_cmdshell 'copy localpath/syslogins.dat destination_share'

  EXEC sp_resolve_logins

  @dest_db = 'dbname',

  @dest_path = 'destination_path',

  @filename = 'filename'

  GO

  注意:使用dts或sp_resolve_logins最後還都是要作一遍sp_change_user_login才能將登陸帳號與db帳號連接起來

  可以用sp_helpuser來察看數據庫賬號情況

  可以用sp_helplogins來查看登陸賬號情況

  13.添加帳號

  exec sp_addlogin 'sys_accounts','pass','default db'

  use db

  go

  exec sp_grantdbaccess 'sys_accounts','db_accounts' --添加到當前數據庫下

  sp_addrolemember 'db_owner','db_accounts' --調整數據庫登陸角色爲db_owner

  或者

  (1).exec sp_addlogin 'sys_accounts','pass','default db' --sp_droplogin 爲刪除登陸帳號

  (2).sp_addsrvrolemember 'sys_accounts',sysadmin --調整系統登陸角色爲administrator

  --更改默認數據庫

  sp_defaultdb 'sa','newdb'

  14.更改數據所有者

  use db

  go

  sp_changedbowner 'newLogin' --將db庫dbo默認的系統登陸帳號(sa)更改爲新系統登陸帳號newLogin,也就是說newlogin賬號有了db數據庫的db_owner權限

  --說得再白一些,newLogin登陸賬號,將擁有db數據庫的db_owner權限,但他卻不需要在db中添加新的數據庫賬號(也就是

  --說在db數據庫中沒有newLogin這個帳號,而是將dbo帳號與newLogin系統帳號連接起來了)

  --因爲,它直接利用dbo這個數據庫賬號。

  use db

  go

  exec sp_changeobjectowner 'gsscowner.sp_tjbm_sci','dbo' --更改表、存儲、試圖對象的所有者,'dbo'處可以使用其他的數據庫賬號,但非系統賬號

  15.分佈連接

  SELECT * FROM Opendatasource('SQLOLEDB','Data Source=ServerName;User ID=MyUID;Password=MyPass').Northwind.dbo.Categories

  16.查詢表使用情況

  EXEC sp_MSforeachtable @command1='sp_spaceused ''?''',@command2='sp_mstablespace ''?'''

  17.測試T-SQL的執行效率

  dbcc DropCleanBuffers --清除緩衝區

  dbcc FreeProcCache --清除過程高速緩存

  set statistics io on

  select count(*) from one --報告查詢中包含的每個表所進行的I/O活動信息,包含掃描的行數和讀取的次數。

  set statistics io off

  set statistics time on

  select count(*) from one --報告關於CPU和查詢的全部執行時間及其查詢結果而運行的其他系統過程(如:編譯和存儲查詢的過程)的信息

  set statistics time off

  set showplan_all on

  go

  select count(*) from one --以文本的形式報告查詢執行的詳細計劃

  go

  set showplan_all off

  18.整理索引

  dbcc showcontig(tbName,ixName) --with ALL_INDEXES

  - 掃描頁數.....................................: 3 --總的分頁數目

  - 掃描擴展盤區數...............................: 2 --一個擴展分區相當於8個連續的分頁

  - 擴展盤區開關數...............................: 1 --當dbcc順着分頁指針瀏覽整個結構時,擴展分區間切換了的次數。說的白一點就是在 --掃描中一個頁與前一頁位於不同盤區的次數

  - 每個擴展盤區上的平均頁數.....................: 1.5--用 擴展分區數(2)/掃描頁數(3) 得出的數據

  - 掃描密度[最佳值:實際值]....................: 50.00%[1:2]--最佳值:3個分頁應該是在一個擴展分區中;實際值:擴展盤區更改的

  --實際次數。2的由來實際是由盤區開關數+1得出的。

  - 邏輯掃描碎片.................................: 0.00%--Out of order pages/掃描頁數(3) .

  Out of order pages 含義:本來按照分頁的連續性,數據分佈的分頁應該是

  緊緊挨着的,但由於數據的修改、刪除而整頁的搬移,造成了數據分佈的不連

  續性,不連續的頁就是out of orders pages .

  --在這裏沒有任何一個分頁不連續,因此爲0

  - 擴展盤區掃描碎片.............................: 0.00%--與上面的意思基本一致,僅僅是將分頁換成了擴展分區

  - 每頁上的平均可用字節數.......................: 246.7--代表每頁空下來未放數據的字節數(平均值)

  - 平均頁密度(完整)...........................: 96.95%--代表分頁填滿的程度(平均值)

  backup log logname to disk='D:/log/db.log'

  alter database dbName set recovery simple /*set recovery bulk_logged*/set recovery full

  dbcc DBReIndex ('db.owner.tbName','ixName','Fill Factor')

  --DBCC INDEXDEFRAG (dbName, tbName, ixName)

  alter database dbName set recovery full

  backup database dbname to disk='D:/db/db.bak'

  19.sp_server_info 用來察看數據庫系統狀態

  20.alter database northwind set MULTI_USER /single_user --設置數據庫爲單用戶/多用戶訪問模式

  sp_dboption 'pubs', 'single user' --判斷數據庫是單用戶還是多用戶

  sp_helpdb --也可判斷

  SELECT DATABASEPROPERTY('master',IsSingleUser)

  21.alter database northwind ... WITH ROLLBACK AFTER integer [SECONDS] | ROLLBACK IMMEDIATE

  --...爲數據庫設置操作

  --回滾未完成的事務

  22.exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','10.50.80.11' --添加連接服務器

  exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','suntting'

  sp_dropserver 'srv_lnk', 'droplogins'--刪除登陸信息

  sp_helpserver

  23.DBCC UPDATEUSAGE/sp_refreshview/sp_recompile/sp_spaceused objectName,true/false

  DBCC UPDATEUSAGE --報告和更正 sysindexes 表的不正確內容,可能會導致 sp_spaceused 產生不正確的空間使用報表。

  sp_refreshview --解決重建視圖的問題,還可以通過重建,發現系統中視圖的語法錯誤。

  sp_recompile --使存儲過程和觸發器在下次運行時重新編譯,若調整了表結構,發現存儲過程運行很慢,可以用這個來解決

  sp_spaceused objectName,true/false --但每次更新表或索引時,sysindexes表中的數據並不立刻更新,因此sp_spaceused輸出的結果不能反映表或索引的空間總數,需要加參數 --true強制更新

  24.修改默認的數據文件組

  ALTER DATABASE dbName MODIFY FILEGROUP dbGroupName/[PRIMARY] DEFAULT

  25.如何把20060126轉成2006-01-26

  select convert(varchar(10),cast('20060126' as datetime),120)

  26.隨機選出數據

  select top 1 * from table order by newid()

  27.怎樣刪除sa

  (1).sa可以刪除但不建議你刪除,其實只要設置好密碼不用它既可

  刪除辦法:

  先獲取修改系統表的權限

  sp_configure ’allow updates’, 1

  go

  RECONFIGURE WITH OVERRIDE

  go

  update sysxlogins set name='modify' where sid=0x01

  update sysxlogins set sid=0x1823BA32F3E6F84EBD5EA43973D810AC where name='modify'

  sp_droplogin 'modify'刪除剛剛修改的賬號即可

  28.刪除/添加擴展存儲過程

  (1).exec master..sp_dropextendedproc 'xp_cmdshell' --刪除

  (2).exec master..sp_addextendedproc xp_cmdshell, 'xplog70.dll'

  (3).exec master..sp_helpextendedproc [exprocname]

  29.select CAST('Aug 1 1996 12:00AM' AS datetime)出錯

  設置默認語言即可

  SET LANGUAGE us_english

  select CAST('Aug 1 1996 12:00AM' AS datetime)

  30.強制使用索引

  with(index(索引名))

  31.跳過被鎖定的行

  select * from tb with(READPAST)

  強制跳過聚集索引的索引頁和索引葉節點頁(數據頁)中行鎖定的部分。

  select * from test with(FASTFIRSTROW) where c1<>1

  32.dts包轉移

  先打開dts包,選擇“另存爲”,在位置處選擇“結構化存儲文件”,將包導出

  導入時,右鍵點“數據轉換服務”,選擇“打開包”,將剛剛導出的包導入即可

  33.進入緊急模式

  Use Master

  Go

  sp_configure 'allow updates', 1

  reconfigure with override

  Go

  34.獲取字節長度

  select DATALENGTH('str')

  35.使用自定義的索引

  select count(*) from equipment with (index(PK_equipment))

  36.目前登陸名、數據帳號

  select SYSTEM_USER

  select user

  select suser_sname

  37.查詢語言支持

  SELECT * FROM ::fn_helpcollations() --系統所支持的所有的語言

  select DATABASEPROPERTYEX( 'dbname','Collation') --查詢當前某庫使用的語言

  sp_helpsort --查看服務器默認的排序情況

  要看錶中的排序情況,請參看syscolumns 或者 sp_help 'tbname'

  39.DBCC check修復步驟

  USE master

  go

  --EXEC sp_dboption 'equipment', 'single user', 'TRUE'

  alter database equipment set single_user with ROLLBACK IMMEDIATE

  go

  --dbcc checkdb(equipment,REPAIR_REBUILD)

  dbcc checkdb(equipment,REPAIR_ALLOW_DATA_LOSS)

  go

  alter database equipment set MULTI_USER with ROLLBACK IMMEDIATE

  go

  40.查詢磁盤使用空間

  EXECUTE master..xp_fixeddrives

  41.快速查詢表的行數

  SELECT @num_rows=rowcnt,@min_indid=indid FROM sysindexes WHERE id=OBJECT_ID(@qualified_table_name)and indid < 2

  42.檢驗兩個表是否相同

  select sum (convert(numeric, binary_checksum(*/colname) ) ) from tbname

  43.獲取一個錯誤的返回值方法

  (1).declare @ret int

  EXEC @ret = sp_addlinkedserver 'srv_lnk2','','SQLOLEDB','10.50.80.14'

  select @ret

  (2).用@@error來判斷

  44.怎麼獲得所有的odbc數據源名稱?

  xp_enumdsn

  44.獲取類似sysobjects的屬性

  exec sp_tables @table_type="'TABLE'"

  exec sp_tables

  select * from INFORMATION_SCHEMA.TABLES where table_type='Base TABLE' and table_name<>'dtproperties'

  45.sysprocesses的應用

  select spid,uid,syslogins.name,login_time,net_address from sysprocesses,syslogins where sysprocesses.sid=syslogins.sid

  46.使用索引服務

  sp_addlinkedserver filesystem,'indexing service','MSIDXS','doc'

   select * from openquery(filesystem,'select directory,filename,docauthor,size,create from scope() where contains(contents,''模塊'')')

  47.ISNUMERIC 確定表達式是否爲一個有效的數字類型。

  48.len(trim()) 判斷是否爲空

  49.讓自動編號的ID從1開始

  truncate table tablename --清表後會自動回到原始

  dbcc checkident('tablename',reseed,1) --重新設置爲1

  SET IDENTITY_INSERT Tablename ON --設置這個選項後就可以insert自定義的id值了

  alter table t_b add newcol int identity(1,1) not null

  50.漢字排序問題

  --按筆劃排序

  select * from sheet2 order by col1 collate Chinese_PRC_Stroke_CS_AS_KS_WS

  Select * From sheet2 Order By col1 Collate Chinese_PRC_Stroke_ci_as

  --按拼音排序

  select * from sheet2 order by col1 collate Chinese_PRC_CS_AS_KS_WS

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章