SQL Server 2005基礎知識整理

1. ACID:指數據庫事務正確執行的四個基本要素縮寫:1.原子性2.一致性3.隔離性4.持久性java

2.數據庫對象:表(table) 視圖(view) 存儲過程(stored procedure) 函數(function)索引(index程序員

3.SQL Server 2005中包含mastermodelmsdbtempdb四個系統數據庫。sql

4.使用T-SQL語句建立數據庫:數據庫

CREATE DATABASE [ApressFinacial] ON  PRIMARY 安全

( NAME = N'ApressFinacial', FILENAME = N'I:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ApressFinacial.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB )數據結構

LOG ON 併發

( NAME = N'ApressFinacial_log', FILENAME = N'I:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ApressFinacial_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)app

5.T-SQL語句刪除數據庫:drop database[數據庫名]ide

6.常見的約束類型:主鍵約束、惟一約束、檢查約束、默認約束、外鍵約束。函數

7.添加約束的語法:

         Alter table 表名

         Add  constraint  約束名 約束類型 具體的約束說明

8.刪除約束:alter table 表名

            Drop constraint 約束名

9.受權語法:  grant 權限[on  表名] to 數據庫用戶 

         例:grant  select  insert  update

              On students  to  zhangsan

10.T-SQL語句建立登陸名:

           Create  login[yuan]

            With  password='130125'

            Go

11.數據庫完整性分爲:實體完整性、域完整性、參照完整性、用戶自定義完整性。

12.T-SQL 中的運算符:

運算符

含義

=

等於

>

大於

<

小於

>=

大於等於

<=

小於等於

<>

不等於

!

通配符

解釋

示例

_

一個字符

A Like 'C_'

%

任意長度的字符

B Like 'CO_%'

[]

括號中所指定範圍內的一個字符

C Like '9W0[1-2]'

[^]

不在括號中所指定範圍內的一個字符

D Like '%[A-Z][^1-2]'

13.查詢語句:select 列名  from 表名  where 條件   如:select*  from students  where       no=1

14.插入數據行:insert  [into]<表名> [列名]values<值列表>

       例:intset into students(name,address,grade,email,sex)

           Values('長青菜','上海松江',5,'zqc@souhu.com','')

      注意:(不能爲標識列指定值,由於它的數字是自動增加的)

15.更新數據行:update <表名> set<列名=更新值>    [where<更新條件>]

      例:update  students

          Set  address='石家莊'

          Where   address='保定'

16.刪除數據行:  delete  from<表名>[where<刪除條件>]

       例:delete from  studentinfo     where  no='180108225'

17.問題:若是標識列A的初始值爲1,增加量爲2,則輸入三行數據之後,再刪除兩行,下次再輸入數據行的時候,標識值從多少開始?      (  7  )

18.刪除列: alter  table  student     drop  column  address

19.Exists:     if  exists (select*from?where  name='yuanDB')  drop  database stuDB

20.變量:   局部變量(必須以標記@做爲前綴)

            全局變量(必須以標記@@做爲前綴)

       全局變量由系統定義和維護,咱們只能讀取,不能修改全局變量的值。

21.局部變量聲明:  例:Decalre  @name  vachar(8)      decare @seat  int

   賦值:set @變量名=值或select@變量名=值  set @name='張三'

           Select @name=sname  from  students  where  no='1'

22.邏輯控制語句: IF-ELSE語句

            If(條件)

              Begin

              語句1

              語句2...........

              End

            Else

            Begin

            語句1

            語句2.........

            End        注:else是可選的。

例: decalre @myavg float

     Select @myavg =AVG(course) from score

     Print'平均分'+convert(varchar(5),@myavg)

     If(@myavg>70)

     Begin

     Print '本班成績優秀,前三名成績爲:'

      Select  top 3 * from  score  order  by score  desc

      End

      Else

        Begin 

        Print  '本班成績較差,後三名成績爲:'

        Select  top 3 *from  score  order  by  score

       End

23.while循環語句:   while(條件)

                     Begin 

                     語句1

                     語句2..........

                     Break

                     End

       例:DECLARE @n int

           WHILE(1=1) --條件永遠成立

           BEGIN

           SELECT @n=COUNT(*) FROM score 

           WHERE score<60    --統計不及格人數

           IF (@n>0)

           UPDATE score     --每人加2

            SET score=score+2 

          ELSE

          BREAK    --退出循環

          END

          print '加分後的成績以下:'

          SELECT * FROM score

24.case--end多分支語句

      語法:    case

                When  條件1  then  結果1

                When  條件2  then  結果2

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

                 Else  其餘結果

                 End

       例:print  'ABCDE五級顯示成績以下:'

           Select  studentID,

               成績=case

                        When  score<60  then'E'

                        When   score  between  60  and  69  then 'D'

                        When   score  between  70  and  79  then 'C'

                         Else  'A'

                      End

                     From  score

25.批處理語句示例:

                   SELECT * FROM stuInfo

                   SELECT * FROM stuMarks

                   UPDATE stuMarks 

                      SET writtenExam=writtenExam+2 

                   GO

26.習題及答案:    

        習題內容:則根據以下規則對成績進行反覆加分,直到平均分超過85分爲止。請編寫T-SQL語句實現。

90分以上:   不加分

8089分:   加1

7079分:   加2

6069分:   加3

60分如下:   加5

         習題答案:

SELECT * FROM score --原始成績

DECLARE @labAvg  int

WHILE(1=1)

 BEGIN

    UPDATE score

      SET score=

        CASE

            WHEN score<60 THEN score+5

            WHEN score between 60 AND 69 THEN score+3

            WHEN score between 70 AND 79 THEN score+2 

            WHEN score between 80 AND 89 THEN score+1

            ELSE score

        END

     SELECT @labAvg=AVG(score) FROM score

       IF  @labAvg>=85

           BREAK

 END

SELECT * FROM score --加分後的成績

27.把一個表中的數據複製到另外一個表中:  insert  into <表名>(列名)

                                       Select  <列名>

                                       From <源表名>

28.把查詢結果放在新表中同時插入新的標識列:

           Select  列名  identity(數據類型,標識種子,標識增加量)as

            列名  into  新表    from  原始表

  例:   select   students.sname, students.saddress,  students.semail,  identity(int,1,1) as  studentID    into  tongxunlu    from students

29.更新數據行:  

      語法:  update<表名

              Set<列名=更新值>

              Where <更新條件>

       例: update  students

             Set   address='軟件學校'

              Where  address='軟件學院'

30.問題:按多列排序:例:select  no,name,address,grade

                   From   students

                   Where   sex  in(1,0)

                   Order by   no,grade

31.字符串函數:

      Replace:    select  replace('莫勒可切.楊可''',‘蘭’)

          返回結果:莫勒蘭切.楊蘭

      Upper:    select  upper('sql server 課程')

       返回結果:SQL SERVER 課程

      Getdate:   select  getdate()獲取當前時間。

       Dateadd:   select  dateaddmm,4,'01/01/2009'

        返回結果:05/01/2009

      Datename:     select  datename(dw,'01/15/2000')

       返回結果:   Saturday

32.聚合函數:

         Max-min:     select  AVG(score) as  平均成績,MAX(score) as 最高分,MIN(score) as最低分       from  score          where  score>=60

         Count:    select  count*as  及格人數      from  score  

                      Where   score>=60

33. 分組查詢:  select  courseid,avg(score) as 課程平均成績

                From  score

                Group  by  courseid

34.習題:   

          假如成績單中記錄了學生的幾回考試成績,要查詢每位學生的每門課的總成績,        怎麼查?        Select  courseidstudentidsumscore) as 總成績

                From  score

                Group  by  courseidstudentid

35.分組查詢--HAVING

             Having:指定了組或聚合的搜索條件,經常與group by子句一塊兒使用。

           例:   select  studentid  as學員編號,avgscoreas 平均成績

                  From   score

                  Group  by  studentidcouseid

                  Having  avgscore>60

36.多表查詢——內聯結     例:select  students.smame, score.courseid, score.score

                              From  students,score

                              Where  students.scode=score.studentid

37.多表聯結——三表聯結     例:select  S.name  as姓名,CS.coursename as課程,C.score as 成績                         from  students  As S

                                Inner Join score  as C  ONS.scode=C.studentid

                                Inner join  course  As CS  ON(CS.courseid=C.courseid)

38.多表聯結查詢——右外聯結   

           例:select  titles.title_id,Titles.title,publishers.pub_name

               From  titles

               Right outer  join  publishers

               On  titles.pub_id=publishers.pub_id

39.銀行案例——多表聯結——左外聯結:

            例:intsert  into  accountaccount.Cardidaccount.score

                Select  users.cardid

                From users 

                Left  Join account  ONaccount.cardid=users.cardid

                Where  account.cardid  is NULL

40.子查詢:  例:select * from  students

                 Where  scode>(select  scode  from  students  where  Sname='張揚')  

                 GO

41.例:內聯結(等值聯結)  select  sname  from  students

                           Inner  Join  score

                           ON  students.scode=score.studentid

                           Where  score=60           GO 

42.局部變量:例:將姓名爲里斯的學生的學號,出生日期和平均成績分別賦給局部變量@no_str @birthday_str @avgrade_num  (用select語句來實現)

             Select  @no_str=s_no,@birthday_str=s_birthday,@avgrade_num=s_avgrade

              From student          where  s_name=里斯

43.自鏈接查詢:     例:(注:student2爲不存在,是建立的)

               Select  student2.sno學號,student2.sname姓名,student2.ssex性別,student2.sspeciality專業,student2.savgrade平均成績

               From studentstudent2

               Where  student.sname=李好 and student.sspeciality=student2.sspeciality 

44.聲明局部變量:declare  @變量名  數據類型

45.if語句       例:查詢學號爲457865的學生,若是成績及格,則打印其姓名和成績。

         Declare @no,char(8),@name char(8),@avgrade numeric(3,1)

         Set @no=457865

         Select @name=sname,@avgrade=savgrade

         From student

         Where sno=@no;

         If @avgrade>60.0

         Begin

         Print @name

         Print @avgrade

         End

         Go

46.if-else語句:對於給定學號的查詢,若是平均成績不及格則打印姓名和平均成績,不然打印學號。

          Declare @no char(8),@name char(8),@avgrade numeric(3,1);

          Set @no=567;

          Select @name=sname,@avgrade=savgrade

          From student

          Where  sno=@no;

          If @avgrade<60.0

          Begin

          Print @name

          Print @avgrade

          End

          Else

          Print @no

          Go

47.多分支的if語句查詢並實現分等級打印學生成績

          Declare @no char(8),@name char(8),@avgrade numeric(3,1);

          Set @no=567;

          Select @name=sname,@avgrade=savgrade

          From student

          Where  sno=@no;

          If @avgrade>=90.0

          Print 優秀

          Else if @avgrade>=80.0

          …………….

          Else print 不及格

          Go

48.case 語句   使用select語句查詢學生的學號,而後用case函數對學生的姓名和愛好進行簡要說明。    Select  學號=sno,姓名及愛好=

              Case sno

              When 123 then 李好,游泳

              。。。。。。。

              Else 沒有這人

              End

              From  student 

49.while語句

      (若是學平生均成績低於85分,則循環執行對每位學生成績加0.5%,在循環過程當中,若是最高成績超過95分則退出循環;在加分過程當中,當成績的平均成績大於或等於80分時打印出當前成績的平均成績)

            Declare @avgrade numeric31);

            Set @avgrade=select  avgsavgrade) from student

            While @avgrade<85

             Begin 

                      Update student

                        Set savgrade=savgrade+savgrade*0.005

                      Set @avgrade=select avgsavgrade) from student

                      If @avgrade>95

                         Break                            --退出循環

                      if@avgrade<80

                      continue                             --結束本次循環

                      print @avgrade

                      End

50.子查詢:查詢成績恰好經過60分的學生

              Select sname from students

                  Inner  Join  score                ---內鏈接

                   ON students.scode=score.studentid

                   Where  score=60

                    Go

51.事務的特性:原子性、一致性、隔離性、永久性。

  事務分類:顯示事務、隱性事務、自動提交事務。

52.系統存儲過程的名稱都以「sp_」開頭或「xp_」開頭。

        EXEC sp_databases     列出當前系統的數據庫

        EXEC sp_help students  查看錶students的信息

53.定義存儲過程的語法:   

             Create  proc[edure]  存儲過程名

              @參數1  數據類型=默認值 output

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

              @參數n  數據類型=默認值 output

              As

              SQL語句

              Go (注:參數可選,參數分輸入參數、輸出參數,輸入參數容許有默認值) 

54.建立不帶參數的存儲過程:     例:

           Creat  procedure  pro_stu

           As

           Declare  @myAvg float

           Select  @myAvg=AVGscore

           From score

           Print '平均分:'+convertvarchar5),@myAvg

           If@myAvg>70

              Print '本班考試成績:優秀' 

            Else

               Print '本班考試成績:較差' 

            Print '-----------------------------------------------------------' 

            Print '參加本次考試沒有經過的學員:' 

               Select  namescodescore

                   From students inner Join score  on 

                   Students.scode=score.studentid     where  score<60        GO 

55.調用存儲過程:   語法:   EXEC  過程名[參數]    例:EXEC proc_stu  

56.輸入參數的默認值:     例:

         Create procedure  proc_stuMn

            @scorePass  int=60        ---及格線默認爲60

         As 

            Print '及格線:' +convert(varchar(5),@scorePass)

            Print '參加本次考試沒有經過的學員:' 

          Select  namescodescore

                From students

                Inner Join score 

                On students.scode=score.studentid

                 Where score<@scorePass

         Go 

57.調用帶參數默認值的存儲過程:  

             EXEC proc_stu    -------採用默認值

             EXEC proc_stu 55    ------不採用默認值

             EXEC proc_stu  @scorePass=55

58.帶輸出參數的存儲過程:

        Create procedure proc_stuM

        @notpassSum  int  output

        @scorePass  int=60

        As  

           Print'及格線:'+convertvarchar5),@scorePass

           Print '參加本次考試沒有經過的學員:'

        Select  namescodescore      from  students

              Inner Join score  On   students.scode=score.studentid

                   Where  score<@scorePass

         Select @notpassSum=countstudentid

               From score where score<@scorePass

         GO

59.調用帶輸出參數的存儲過程:(注:調用時必須帶output關鍵字,返回結果將存放在變量@sum 中)

           Declare @sum int

           EXEC proc_stuM @sum output60

           Print '--------------------------------------------------'

           If @sum>=3

                 Print '未經過人數:'+convertvarchar5),@sum +'人,超過60%,及格分數線還應下調'

           Else 

                  Print '未經過人數:'+convertvarchar5),@sum +'人,已控制在60%如下,及格分數線適中'           

           GO

60.錯誤處理:   

                   使用Raiserror語句:

           Create  procedure  pro_stuM

                  @notpassSum  int output

                  @scorePass  int=60

            As

               Ifnot  @scorePass  between 0 and 100

                   Begin

                   Raiserror'及格線錯誤,請指定0100之間的分數,統計中斷退出'161) --------引起系統錯誤,指定錯誤的嚴重級別16,調用狀態爲1(默認),並影響@@ERROR 系統變量的值

                   Return   --------當即返回,退出存儲過程

             End 

               ...............其餘語句同上例

             Go 

61.使用raiserror語句

          Declare  @sum int@t int

          EXEC proc_stum @sum  output, 604   ----筆試及格線誤輸入604

          Set @t=@@error

          Print '錯誤號:'+convertvarchar5),@t

          If @t<>o

          Return   ------退出批處理,後續語句再也不執行

          Print '-----------------------------------'      -----若是執行了raiseerror語句,系統全局@@error 將不等於0,表示出現了錯誤.

           If @sum>=3

             Print '未經過人數:'+convert(varchar(5),@sum)+'人,超過了60%,及格分數線還應下調'

           Else   print '未經過人數:'+convert(varchar(5),@sum)+'人,已控制在60%如下,及格分數線適中'              GO 

62.調用存儲過程:          例:

               Declare  @s  int

               Exec proc_stuinfo  '張三@s , 30    ———錯誤!應爲(exec proc_stuinfo '張三'@s  output30

                Exec proc_stuinfo '張三@s     ————錯誤!應爲(exec proc_stuinfo '張三'@s output

                Exec proc_stuinfo  @sAge=22@stuName='李四'@m=@s output(正確!)

63.帶輸出參數的存儲過程:   例:

           Declare @sum  int

           Exec proc_stuM @sum  output60

           Print '-----------------------------------------'

           If  @sum>=3

              Print'未經過人數:'+convertvarchar5),@sum +'人,超過60%,及格分數線還應下調'

           Else  

               Print'未經過人數:'+convertvarchar5),@sum +'人,已控制在6060%如下,及格分數線適中'       GO

64.建立觸發器語法:    Create  trigger  trigger_name

                       On  table_name

                       [with  encryption] --------表示加密觸發器定義的SQL文本

                       For [delete,insert,update]    -------指定觸發器類型

                       As 

                         T_SQL語句

                       GO    

65.Insert 觸發器   例:

       Create trigger  trig_transInfo

       On  transInfo

        For  insert

        As 

        Declare  @type  char4),@outMoney  Money

        Declare  @myCardID  char10),@balance  Money

        Declare  @currentMoney  money

        Select  @type=transType,@outMoney=transMoney,@myCardID=cardID from inserted

              If(@type='支取')

                   Update  bank  set  currentMoney=currentMoney-@outMoney

                   Where  cardID=@myCardID

              Else  

                   Update  bank  set  currentMoney=currentMoney+@outMoney

                   Where  cardID=@myCardID

66. 插入一條語句     例:

          Insert  into  transInfotransTypetransMoneycardID

          Values '支取'200'10011001'

67. Delete觸發器示例:

            Create  trigger  tri_delete_transInfo

            On  transInfo

            For  delete

            As 

                Print '開始備份數據,請稍候......'

                If  not  existsselect * from  sysobjects  where  name='backupTable'

                Select * into backupTable  from  deleted        ------------deleted表中獲取被刪除的交易記錄。

                 Else 

                    Insert  into backupTable  select * from  deleted 

                    Print '備份數據成功,備份表中的數據爲:'

                    Select * from  backupTable 

                    Select * from  transInfo

                GO    

68. Update 觸發器:

            Create  trigger  trig_update_bank

            On  bank 

            For  update

            As  

                Declare  @beforeMoney  Money@afterMoney  Money

                Select  @beforeMoney=currentMoney  from  deleted   -------(從deleted表中獲取交易前的金額,從inserted表中獲取交易後的餘額)

                Select  @afterMoney=currentMoney  from  inserted   

                If  ABS@afterMoney-@beforeMoney>20000 ------交易金額是否>2

                       Begin

                          Print '交易金額:'+convertvarchar8),

                          ABS@afterMoney-@beforeMoney)

                        Raiserror ('每筆交易不能超過2萬元,交易失敗',16,1)

                        Rollback  transaction         ------------回滾事務,撤銷交易

                        End

            Go

69. 列級update觸發器

         Create  trigger  trig_update_transIfo

         ON  transInfo

         For  update

         As

             If  updatetransDate

             Begin                -------檢查是否修改了交易日期列transDate

             Print  '交易失敗......'

             Raiserror'安全警告:交易日期不能修改,由系統自動產生'161

             Rollback  transaction          ----------回滾事務,撤銷交易

             End

         GO

70.數據庫階段數據管理的主要特色1.採用數據模型表示複雜的數據結構;2.有較高的數據獨立性;3.爲用戶提供了方便的用戶接口;4.提供數據控制功能;5.增長系統 的靈活性。

71.   DB(數據庫)存儲在計算機內有組織的、統一管理的相關數據的集合。

  DBMS(數據庫管理系統)位於用戶與操做系統之間的數據管理軟件。

  DBS(數據庫系統)是實現有組織的、動態的存儲大量關聯數據,以方便用戶訪問計算就硬件、軟件和株距資源組成的計算機系統。

72.物理數據獨立性和邏輯數據獨立性:

       物理數據獨立性:內模式的修改,只需對模式/內模式映象作相應修改,而不需修改        概念模式。邏輯數據獨立性:概念模式的修改,只需對外模式/模式映象作相應修改,而不

需修改外模式。

73.  DBMS的主要功能:

        數據定義(DDL):三級結構、兩級映象、完整性約束等。數據操縱(DML):檢索、更新。數據保護:數據恢復、併發控制、完整性控制、安全性控制等。數據維護:數據載入、轉換、存儲、、性能監控等。數據字典(DD):存儲三級結構定義的數據庫稱爲DD,即系統數據庫。DBMS主要功能:數據庫定義功能、數據存取功能、數據庫運行管理功能、數據庫的創建和維護功能。

74.--1、建立存儲過程--

if exists (select * from sysobjects where name='Sum_wage')

drop procedure Sum_wage

GO

create procedure Sum_wage 

@PWage int,

@AWage int,

@total int

as 

while (1=1)

begin

if (select count(*) from ProWage)>2*(select count(*) from ProWage where Wage>=@PWage)

update ProWage set @total=@total+@AWage,Wage=Wage+@AWage

else

break

end

print'一共加薪:'+convert(varchar,@total)+''

print'加薪後的程序員工資列表:'

select * from ProWage

--調用存儲過程1--

exec Sum_wage @PWage=2000,@AWage=100,@total=0

exec Sum_wage @PWage=2200,@AWage=100,@total=0

exec Sum_wage @PWage=3000,@AWage=100,@total=0

exec Sum_wage @PWage=4000,@AWage=100,@total=0

exec Sum_wage @PWage=5000,@AWage=100,@total=0

exec Sum_wage @PWage=6000,@AWage=100,@total=0

75.

if exists (select * from sysobjects where name='Avg_wage')

drop procedure Avg_wage

GO

create procedure Avg_wage 

@PWage int,

@AWage int,

@total int

as 

while (1=1)

begin

if ((select Avg(Wage) from ProWage)<=@PWage)

update ProWage set @total=@total+@AWage,Wage=Wage+@AWage

else

break

end

print'一共加薪:'+convert(varchar,@total)+''

print'加薪後的程序員工資列表:'

select * from ProWage

--調用存儲過程--

exec Avg_wage @PWage=3000,@AWage=200,@total=0

exec Avg_wage @PWage=4500,@AWage=200,@total=0

76.代碼:

INSERT INTO studentinformation(S_name,S_no,S_grade,S_address)

VALUES('花無影',25,'軟件0802','河北')

 

select studentinformation.S_name,studentinformation.S_no

into information2

from studentinformation

select S_no,S_grade,S_name

from studentinformation

where S_school='軟件學院'

order by S_no

select S_no,S_name,S_class

from studentinformation

where S_sex=''and S_name<>'花無影'

order by S_no

SELECT top 20 percent sname as 姓名,sno as 學號,saddress as 地址

FROM  yuan

WHERE  sschool ='軟件學院'

ORDER BY  sno asc,sname desc

select charindex('data','my data is set',1)    data的索引位置)

select len('java xuexibiji')      (字符串長度)

select lower('BAO DING DIANLI ZHI YE JI SHU XUE YUAN')   (轉換成小寫)

select replace('軟件學院','軟件學院','軟件工程學院')  (替換)

select stuff('a b c d e f g h i j k l m n',3,6,'今天的學習內容')   (從第三字符個開始替換,替換6個字符)

select getdate()   (當前日期)

select dateadd(dd,250,'04/12/2009')   250天后的日期)

select datediff(mm,'04/20/2005','08/05/2010')   (相差的月數)

select datename(dw,'04/12/2009')    (返回星期幾)

select datepart(dd,'04/12/2009')    (返回當天是幾號)

select abs(-10)   絕對值

select ceiling(-32.8)    返回大於或等於該數的最小整數

select power(102,3)   取數值表達式的冪值

select round(3.141592653,4)     (?)將數值表達式四捨五入成指定精度

select sign(1000)   正數返回1,負數返回-10返回0.

select sqrt(6.25)      //返回該數據的平方根

select convert(varchar(100),45678932) //轉變數據類型  

select current_user      //返回當前用戶的名字

select datalength('軟件學院')    //返回字符長度

select host_name()   //返回用戶登陸的計算機名

select system_user      //返回登陸的用戶名

select user_name(1)     //從任意數據庫中返回dbo(jizhu)

create proc pro_stu

@scorepass float

as

print '學號'+convert(varchar(5),@scorepass)

select name

from stuent

where student.score=@scorepass

go

exec pro_stu @scorepass=85

76.導出SQL Server數據庫中數據:

declare @objectId int 

set @objectId=object_id('sun') 

if @objectId is not null 

begin 

    drop proc sun 

end 

go 

create proc sun (@tablename varchar(256)) 

as 

begin 

    set nocount on 

    declare @sqlstr varchar(4000) 

    declare @sqlstr1 varchar(4000) 

    declare @sqlstr2 varchar(4000) 

    select @sqlstr='select ''insert '+@tablename 

    select @sqlstr1='' 

    select @sqlstr2='(' 

    select @sqlstr1='values (''+' 

    select @sqlstr1=@sqlstr1+col+'+'',''+' ,@sqlstr2=@sqlstr2+name +',' from (select case 

    when a.xtype =173 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end' 

    when a.xtype =104 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(1),'+a.name +')'+' end' 

    when a.xtype =175 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end' 

    when a.xtype =61 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end' 

    when a.xtype =106 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end' 

    when a.xtype =62 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end' 

    when a.xtype =56 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(11),'+a.name +')'+' end' 

    when a.xtype =60 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end' 

    when a.xtype =239 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end' 

    when a.xtype =108 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end' 

    when a.xtype =231 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end' 

    when a.xtype =59 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end' 

    when a.xtype =58 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end' 

    when a.xtype =52 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(12),'+a.name +')'+' end' 

    when a.xtype =122 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end' 

    when a.xtype =48 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(6),'+a.name +')'+' end' 

    when a.xtype =165 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end' 

    when a.xtype =167 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end' 

    else '''NULL''' 

    end as col,a.colid,a.name 

    from syscolumns a where a.id = object_id(@tablename) and a.xtype <>189 and a.xtype <>34 and a.xtype <>35 and a.xtype <>36 

    )t order by colid 

    select @sqlstr=@sqlstr+left(@sqlstr2,len(@sqlstr2)-1)+') '+left(@sqlstr1,len(@sqlstr1)-3)+')'' from '+@tablename 

    print @sqlstr 

    exec( @sqlstr) 

    set nocount off 

end 

go

相關文章
相關標籤/搜索