学习SQL应知道的动态SQL语句基本语法1、普通SQL语句可以用Exec执行eg:Select*fromtableNameExec('select*fromtableName')Execsp_executesqlN'select*fromtableName'--请注意字符串前一定要加N2、字段名,表名,数据库名之类作为变量时,必须用动态SQLeg:declare@fnamevarchar(20)set@fname='FiledName'Select@fnamefromtableName--错误,不会提示错误,但结果为固定值FiledName,并非所要。Exec('select'+@fname+'fromtableName')--请注意加号前后的单引号的边上加空格当然将字符串改成变量的形式也可declare@fnamevarchar(20)set@fname='FiledName'--设置字段名declare@svarchar(1000)set@s='select'+@fname+'fromtableName'Exec(@s)--成功execsp_executesql@s--此句会报错declare@sNvarchar(1000)--注意此处改为nvarchar(1000)set@s='select'+@fname+'fromtableName'Exec(@s)--成功execsp_executesql@s--此句正确3、输出参数declare@numint,@sqlsnvarchar(4000)set@sqls='selectcount(*)fromtableName'exec(@sqls)--如何将exec执行结果放入变量中?declare@numint,@sqlsnvarchar(4000)set@sqls='select@a=count(*)fromtableName'execsp_executesql@sqls,N'@aintoutput',@numoutputselect@num此外,如果想要在SQL语句字符串中使用单引号''可以使用''SQLServer数据库中经常用到的identity列发布时间:2008.03.2404:59来源:赛迪网作者:Alice【赛迪网-IT技术报道】SQLServer中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便。但它有时还会带来一些麻烦。示例一:当表中被删除了某些数据的时候,自增长列的编号就不再是一个连线的数列。这种时候我们可以用以下方案来解决。SETIDENTITY_INSERT[TABLE][ON|OFF]允许将显式值插入表的标识列中,当设置为ON时,这时可能在INSERT操作时手工指定插入到标识列中的编号,同时必须在操作完成后,将IDENTITY_INSERT还原成OFF,否则下次插入的时候必须指定编号,那不然就无法完成INSERT操作。示例二:当表中的记录被全部删除,但此时标识列的值越来越大的时候,如果不加以重置,它还会无休止的增长。这个时候我们就要用到:DBCCCHECKIDENT(TABLE,[RESEED|NORESEED],[1])将把指定表的种子值强制重设为1。然而,你可能不想将种子重设为1,在这种情况下,你可以用你想用的种子值替代第三个参数。有时候你可能想知道当前的种子,而不是想重设种子,这时你就要用到NORESEED,而不用再去顾忌第三个参数。“一网打尽”通用SQL数据库的查询语句(1)发布时间:2008.01.0404:40来源:赛迪网作者:20933通用SQL数据库的查询语句:(注释:本文中Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。)一、简单查询简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。SELECTnickname,emailFROMtesttableWHEREname='张三'(一)选择列表选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。1、选择所有列例如,下面语句显示testtable表中所有列的数据:SELECT*FROMtesttable2、选择部分列并指定它们的显示次序查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如:SELECTnickname,emailFROMtesttable3、更改列标题在选择列表中,可重新指定列标题。定义格式为:列标题=列名列名列标题如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:SELECT昵称=nickname,电子邮件=emailFROMtesttable4、删除重复行SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。5、限制返回的行数使用TOPn[PERCENT]选项限制返回的数据行数,TOPn说明返回n行,而TOPnPERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如:SELECTTOP2*FROMtesttableSELECTTOP20PERCENT*FROMtesttable(二)FROM子句FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:SELECTusername,citytable.cityidFROMusertable,citytableWHEREusertable.cityid=citytable.cityid在FROM子句中可用以下两种格式为表或视图指定别名:表名as别名表名别名例如上面语句可用表的别名格式表示为:SELECTusername,b.cityidFROMusertablea,citytablebWHEREa.cityid=b.cityidSELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。例如:SELECTa.au_fname+a.au_lnameFROMauthorsa,titleauthorta(SELECTtitle_id,titleFROMtitlesWHEREytd_sales10000)AStWHEREa.au_id=ta.au_idANDta.title_id=t.title_id此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。(三)使用WHERE子句设置查询条件WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:SELECT*FROMusertableWHEREage20WHERE子句可包括各种条件运算符:比较运算符(大小比较):、=、=、、=、、!、!范围运算符(表达式值是否在指定的范围):BETWEEN…AND…NOTBETWEEN…AND…列表运算符(判断表达式是否为列表中的指定项):IN(项1,项2……)NOTIN(项1,项2……)模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOTLIKE空值判断符(判断表达式是否为空):ISNULL、NOTISNULL逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR1、范围运算符例:ageBETWEEN10AND30相当于age=10ANDage=302、列表运算符例:countryIN('Germany','China')3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。可使用以下通配字符:百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[]相同,但它要求所匹配对象为指定字符以外的任一个字符。例如:限制以Publishing结尾,使用LIKE'%Publishing'限制以A开头:LIKE'[A]%'限制以A开头外:LIKE'[^A]%'4、空值判断符例WHEREageISNULL5、逻辑运算符:优先级为NOT、AND、OR(四)查询结果排序使用ORDERBY子句对查询返回的结果按一列或多列排序。ORDERBY子句的语法格式为:ORDERBY{column_name[ASC¦DESC]}[,…n]其中ASC表示升序,为默认值,DESC为降序。ORDERBY不能按ntext、text和image数据类型进行排序。例如:SELECT*FROMusertableORDERBYagedesc,useridASC另外,可以根据表达式进行排序。二、联合查询UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:select_statementUNION[ALL]selectstatement[UNION[ALL]selectstatement][…n]其中selectstatement为待联合的SELECT查询语句。ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。在使用UNION运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:查询1UNION(查询2UNION查询3)三、连接查询通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。连接可以在SELECT语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。SQL-92标准所定义的FROM子句的连接语法格式为:FROMjoin_tablejoin_typejoin_table[ON(join_condition)]其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。join_type指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNERJOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,