本文æ¥è‡ªCSDNåšå®¢åQŒè{è½½è¯·æ ‡æ˜Žå‡ºå¤„åQšhttp://blog.csdn.net/fuwei2241/archive/2006/09/06/1185198.aspx
LONG: å¯å˜é•¿çš„å—符ä¸?/font>æ•°æ®åQŒæœ€é•?GåQŒLONGå…ähœ‰VARCHAR2列的ç‰ÒŽ€§ï¼Œå¯ä»¥å˜å‚¨é•¿æ–‡æœ¬ä¸€ä¸ªè¡¨ä¸æœ€å¤šä¸€ä¸ªLONGåˆ?br />
  LONG RAW: å¯å˜é•?font color="#993300">二进åˆ?/font>æ•°æ®åQŒæœ€é•?G
  CLOB: å—符大对è±?font size="+0">Clob 用æ¥å˜å‚¨å•å—节的å—符数æ®
  NCLOB: 用æ¥å˜å‚¨å¤šå—节的å—符数æ®
  BLOB: 用于å˜å‚¨äºŒè¿›åˆ?/font>æ•°æ®
  BFILE: å˜å‚¨åœ¨æ–‡ä»¶ä¸çš?font color="#993300">二进åˆ?/font>æ•°æ®åQŒè¿™ä¸ªæ–‡ä»¶ä¸çš„æ•°æ®åªèƒ½è¢«åªè¯»è®Ñ€‚但该文件ä¸åŒ…å«åœ¨æ•°æ®åº“内ã€?/font>
bfileå—æ®µå®žé™…的文件å˜å‚¨åœ¨æ–‡äšg¾pÈ»Ÿä¸?å—æ®µä¸å˜å‚¨çš„æ˜¯æ–‡ä»¶å®šä½æŒ‡é’?bfile对oracleæ¥è¯´æ˜¯åªè¯Èš„,也ä¸å‚ä¸Žäº‹åŠ¡æ€§æŽ§åˆ¶å’Œæ•°æ®æ¢å¤.
  
  CLOBåQŒNCLOBåQŒBLOB都是内部çš?font color="#993300">LOB(Large Object)¾cÕdž‹åQŒæœ€é•?GåQŒæ²¡æœ‰LONGåªèƒ½æœ‰ä¸€åˆ—çš„é™åˆ¶
  è¦ä¿å˜å›¾ç‰‡ã€æ–‡æœ¬æ–‡ä»¶ã€Wordæ–‡äšgå„è‡ªæœ€å¥½ç”¨å“ªç§æ•°æ®¾cÕdž‹?
  --BLOB最好,LONG RAW也ä¸é”™ï¼Œä½†Long是oraclež®†è¦åºŸå¼ƒçš„ç±»åž‹ï¼Œå› æ¤å»ø™®®ç”¨BLOBã€?/font>
本文æ¥è‡ªCSDNåšå®¢åQŒè{è½½è¯·æ ‡æ˜Žå‡ºå¤„åQšhttp://blog.csdn.net/fuwei2241/archive/2006/09/06/1185198.aspx
insert into t_test12 (ID, NO)
values (1, 'lin');
insert into t_test12 (ID, NO)
values (2, '13800162');
insert into t_test12 (ID, NO)
values (3, '13800163');
insert into t_test12 (ID, NO)
values (4, '13800164');
insert into t_test12 (ID, NO)
values (5, '13800165');
insert into t_test12 (ID, NO)
values (6, '13800166');
æŽ§åˆ¶å°æŠ›å‡ø™¿™ä¸ªå¼‚常:java.sql.SQLException: ORA-00911: invalid character select count(t.id) as onerowc,t.id as areatravelid ,b.id as airpotid from base_areatravel t inner join base_airpot b on b.areaid=t.id group by t.id ,b.id; 以上是完完整整的输出¾l“æžœåQŒç„¶åŽæˆ‘ž®†è¯å¥å¤åˆ¶åˆ°PL/SQL䏿‰§è¡Œæ˜¯å®Œå…¨å¯ä»¥çš„,没有ä»ÖM½•异常的。ã€?/p> 而我在程åºä¸å®šä¹‰çš„sql如下åQ?/p> String sql="select count(t.id) as onerowc,t.id as areatravelid ,b.id as airpotid from base_areatravel t"+ 呵呵åQŒèŠ±è´¹äº†åŠä¸ªå¤šå°æ—¶ç»ˆäºŽæ‰¾åˆ°åŽŸå› ï¼šåQšï¼šåQ?/p> 哈哈åQŒï¼Œå®šä¹‰è¯å¥ä¸sqlåŽé¢å¤šäº†ä¸€ä¸ªåˆ†å—÷€‚(“åQ?#8221;åQ‰æ™•èœã€‚。这æ ïLš„è¯åœ¨PL/SQL䏿˜¯æ— 所谓的åQŒå¯æ˜¯Java 的数æ®åº“驱动å´ä¸è¯†åˆ«˜q™æ ·çš„è¯å¥äº†ã€‚æ±—åQŒï¼ŒåQŒå¤ªå¤§æ„了。记录下æ¥é˜²æ¢å†‹Æ¡çŠ¯é”™ï¼Œå‘µå‘µã€‚ã€‚ã€?/p> |
一.引用文ç«
SELECT /*+ FIRST_ROWS */ * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A --䏿ޒåº?br />
WHERE ROWNUM <= 40
)
WHERE RN >= 21;
SELECT /*+ FIRST_ROWS */ *
FROM (SELECT a.*, row_number() over(ORDER BY 1) rn--凿ޒåºï¼Œé€Ÿåº¦åŒä¸Š
FROM t1 a)
WHERE rn BETWEEN 21 AND 40;
SELECT *
FROM (SELECT a.*, row_number() over(ORDER BY c1) rn --真实排åºåQŒæ— 法比较速度
FROM t1 a)
WHERE rn BETWEEN 21 AND 40;
Oracle的分™å‰|Ÿ¥è¯¢è¯å¥åŸºæœ¬ä¸Šå¯ä»¥æŒ‰ç…§æœ¬æ–‡¾l™å‡ºçš„æ ¼å¼æ¥˜q›è¡Œå¥—用ã€?br /> åˆ†é¡µæŸ¥è¯¢æ ¼å¼åQ?/p>
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
其䏿œ€å†…层的查询SELECT * FROM TABLE_NAME表示ä¸è¿›è¡Œç¿»™å늚„原始查询è¯å¥ã€‚ROWNUM <= 40å’ŒRN >= 21控制分页查询的毙å늚„范围ã€?/p>
上颾l™å‡ºçš„这个分™å‰|Ÿ¥è¯¢è¯å¥ï¼Œåœ¨å¤§å¤šæ•°æƒ…况拥有较高的效率。分™å늚„目的ž®±æ˜¯æŽ§åˆ¶è¾“出¾l“果集大ž®ï¼Œž®†ç»“果尽快的˜q”回。在上é¢çš„分™å‰|Ÿ¥è¯¢è¯å¥ä¸åQŒè¿™¿U考虑主è¦ä½“现在WHERE ROWNUM <= 40˜q™å¥ä¸Šã€?/p>
选择½W?1åˆ?0æ¡è®°å½•å˜åœ¨ä¸¤¿U方法,一¿U是上é¢ä¾‹åä¸å±•½Cºçš„在查询的½W¬äºŒå±‚通过ROWNUM <= 40æ¥æŽ§åˆ¶æœ€å¤§å€û|¼Œåœ¨æŸ¥è¯¢çš„æœ€å¤–层控制最ž®å€¹{€‚而å¦ä¸€¿Uæ–¹å¼æ˜¯åŽÀLŽ‰æŸ¥è¯¢½W¬äºŒå±‚çš„WHERE ROWNUM <= 40è¯å¥åQŒåœ¨æŸ¥è¯¢çš„æœ€å¤–层控制分页的最ž®å€¼å’Œæœ€å¤§å€¹{€‚这是,查询è¯å¥å¦‚下åQ?/p>
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40
å¯Òޝ”˜q™ä¸¤¿U写法,¾l大多数的情况下åQŒç¬¬ä¸€ä¸ªæŸ¥è¯¢çš„æ•ˆçŽ‡æ¯”ç¬¬äºŒä¸ªé«˜å¾—å¤šã€?/p>
˜q™æ˜¯ç”׃ºŽCBO优化模å¼ä¸‹ï¼ŒOracleå¯ä»¥ž®†å¤–层的查询æ¡äšg推到内层查询ä¸ï¼Œä»¥æé«˜å†…层查询的执行效率。对于第一个查询è¯å¥ï¼Œ½W¬äºŒå±‚的查询æ¡äšgWHERE ROWNUM <= 40ž®±å¯ä»¥è¢«Oracle推入到内层查询ä¸åQŒè¿™æ ·Oracle查询的结果一旦超˜q‡äº†ROWNUMé™åˆ¶æ¡äšgåQŒå°±¾lˆæ¢æŸ¥è¯¢ž®†ç»“果返回了ã€?/p>
而第二个查询è¯å¥åQŒç”±äºŽæŸ¥è¯¢æ¡ä»¶BETWEEN 21 AND 40是å˜åœ¨äºŽæŸ¥è¯¢çš„第三层åQŒè€ŒOracleæ— æ³•ž®†ç¬¬ä¸‰å±‚的查询æ¡ä»¶æŽ¨åˆ°æœ€å†…层åQˆå³ä½¿æŽ¨åˆ°æœ€å†…层也没有æ„ä¹‰ï¼Œå› äØ“æœ€å†…å±‚æŸ¥è¯¢ä¸çŸ¥é“RNä»£è¡¨ä»€ä¹ˆï¼‰ã€‚å› æ¤ï¼Œå¯¹äºŽ½W¬äºŒä¸ªæŸ¥è¯¢è¯å¥ï¼ŒOracle最内层˜q”回¾l™ä¸é—´å±‚的是所有满‘Ïx¡ä»¶çš„æ•°æ®åQŒè€Œä¸é—´å±‚˜q”回¾l™æœ€å¤–层的也是所有数æ®ã€‚æ•°æ®çš„˜q‡æ×o在最外层完æˆåQŒæ˜¾ç„¶è¿™ä¸ªæ•ˆçŽ‡è¦æ¯”第一个查询低得多ã€?/p>
上é¢åˆ†æžçš„æŸ¥è¯¢ä¸ä»…仅是针对å•表的½Ž€å•æŸ¥è¯¢ï¼Œå¯¹äºŽæœ€å†…å±‚æŸ¥è¯¢æ˜¯å¤æ‚的多表è”åˆæŸ¥è¯¢æˆ–æœ€å†…å±‚æŸ¥è¯¢åŒ…å«æŽ’åºçš„æƒ…况一æ ähœ‰æ•ˆã€?/p>
˜q™é‡Œž®×ƒ¸å¯¹åŒ…嫿ޒåºçš„æŸ¥è¯¢˜q›è¡Œè¯´æ˜Žäº†ï¼Œä¸‹ä¸€½‹‡æ–‡ç« ä¼šé€šè¿‡ä¾‹åæ¥è¯¦¾l†è¯´æ˜Žã€‚下é¢ç®€å•讨è®ÞZ¸€ä¸‹å¤šè¡¨è”åˆçš„æƒ…况。对于最常è§çš„ç‰å€ÆD¡¨˜qžæŽ¥æŸ¥è¯¢åQŒCBO一般å¯èƒ½ä¼šé‡‡ç”¨ä¸¤ç§˜qžæŽ¥æ–¹å¼NESTED LOOPå’ŒHASH JOINåQˆMERGE JOIN效率比HASH JOIN效率低,一般CBOä¸ä¼šè€ƒè™‘åQ‰ã€‚在˜q™é‡ŒåQŒç”±äºŽä‹É用了分页åQŒå› æ¤æŒ‡å®šäº†ä¸€ä¸ªè¿”回的最大记录数åQŒNESTED LOOP在返回记录数‘…过最大值时å¯ä»¥é©¬ä¸Šåœæ¢òq¶å°†¾l“æžœ˜q”回¾l™ä¸é—´å±‚åQŒè€ŒHASH JOIN必须处ç†å®Œæ‰€æœ‰ç»“果集åQˆMERGE JOIN也是åQ‰ã€‚那么在大部分的情况下,对于分页查询选择NESTED LOOPä½œäØ“æŸ¥è¯¢çš„è¿žæŽ¥æ–¹æ³•å…·æœ‰è¾ƒé«˜çš„æ•ˆçŽ‡åQˆåˆ†™å‰|Ÿ¥è¯¢çš„æ—¶å€™ç»å¤§éƒ¨åˆ†çš„æƒ…况是查询å‰å‡ 页的数æ®ï¼Œ‘Šé åŽé¢çš„é¡µæ•°è®¿é—®å‡ çŽ‡è¶Šž®ï¼‰ã€?/p>
å› æ¤åQŒå¦‚æžœä¸ä»‹æ„在系¾lŸä¸ä½¿ç”¨HINTçš„è¯åQŒå¯ä»¥å°†åˆ†é¡µçš„æŸ¥è¯¢è¯å¥æ”¹å†™äØ“åQ?/p>
SELECT /*+ FIRST_ROWS */ * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
äº?我的å˜å‚¨˜q‡ç¨‹
create or replace package CJ_PageData is
TYPE type_cur IS REF CURSOR; --å»ºç«‹æ¸¸æ ‡
PROCEDURE CJ_GetDataByPage
(
tblName in varchar2,
strGetFields in varchar2,
fldName in varchar2,
PageSize in number,
PageIndex in number,
doCount in number,
OrderType in number,
strWhere in varchar2,
DataCount out number,
DataSet out type_cur
);
end CJ_PageData;
CREATE OR REPLACE PACKAGE BODY CJ_PageData
AS
PROCEDURE CJ_GetDataByPage
(
tblName in varchar2, --表å
strGetFields in varchar2, --˜q”å›žå—æ®µ
fldName in varchar2, --排åºå—段å?/p>
PageSize in number, --分页大å°
PageIndex in number, --™åëŠ
doCount in number, --是妾lŸè®¡(0å?1æ˜?
OrderType in number, --排庾cÕdž‹(0é™?1å?
strWhere in varchar2, --½{›é€‰æ¡ä»?/p>
DataCount out number, --˜q”回记录æ€ÀL•°
DataSet out type_cur --˜q”å›žæ¸¸æ ‡(指针)
)
as
strSQL varchar2(5000) ; -- 临时记录Sqlè¯å¥
strOrder varchar2(400) ; -- 临时记录排åºè¯å¥
begin
if doCount <> 0 then
begin
if strWhere <> ' ' then
strSQL := 'select count(*) as total from ' || tblName || ' where '||strWhere;
else
strSQL := 'select count(*) as total from ' || tblName;
end if;
execute immediate strSQL into DataCount;--å–出记录æ€ÀL•°æ”‘Ö…¥˜q”回å˜é‡DataCount
end;
else
begin
strSQL := 'select ' ||strGetFields||' from (select T2.*,rownum rn from (select T1.* from ' || tblName||' T1 ';
--得到排庾cÕdž‹è¯å¥
if OrderType <> 0 then
begin
strOrder := ' order by ' || fldName ||' asc';
end;
else
begin
strOrder := ' order by ' || fldName ||' desc';
end;
end if;
begin
--¾l„装SQlè¯å¥
if strWhere <> ' ' then
strSQL := strSQL || ' where ' || strWhere || ') T2 where rownum <=' || TO_CHAR(PageIndex*PageSize) || ')'
|| ' where rn >' || TO_CHAR((PageIndex-1)*PageSize) || strOrder;
else
strSQL := strSQL || ' ) T2 where rownum <=' || TO_CHAR(PageIndex*PageSize) || ')'
|| ' where rn >' || TO_CHAR((PageIndex-1)*PageSize) || strOrder;
end if;
end;
end;
end if;
open DataSet for strSQL;
end;
end CJ_PageData;
ä¸?.Netä¸è°ƒç”¨å˜å‚¨è¿‡½E?/p>
1.æ–ÒŽ³•
/// <summary>
/// 获得记录æ€ÀL•°å’Œæ‰€æœ‰è®°å½•{˜qžæŽ¥å—符ä¸?å˜å‚¨˜q‡ç¨‹,è¡?˜q”å›žå—æ®µ,排åºå—段,分页大å°,™åëŠ ,¾lŸè®¡(1æ˜?0䏿˜¯),排åº(1å‡åº,0é™åº),æ¡äšg}
/// </summary>
/// <param name="strConn"></param>
/// <param name="strSPName">å˜å‚¨˜q‡ç¨‹åå—</param>
/// <param name="strTableName">表å</param>
/// <param name="strGetFields">˜q”å›žå—æ®µå—符ä¸?lt;/param>
/// <param name="strFieldName">排åºå—段</param>
/// <param name="iPageIndex">™åëŠ </param>
/// <param name="iPageSize">分页大å°</param>
/// <param name="iDoCount">是妾lŸè®¡è®°å½•æ€ÀL•°(1¾lŸè®¡,0ä¸ç»Ÿè®?</param>
/// <param name="iOrderType">排庾cÕdž‹(0å‡åº,1é™åº)</param>
/// <param name="strWhere">½{›é€‰æ¡ä»?ä¸å¸¦where)</param>
protected void BuildData(string strConn,string strSPName,string strTableName,string strGetFields,string strFieldName,int iPageSize,int iPageIndex,int iDoCount,int iOrderType,string strWhere)
{
System.Data.OracleClient.OracleConnection conn = new OracleConnection();
System.Data.OracleClient.OracleCommand cmd = new OracleCommand();
System.Data.OracleClient.OracleDataReader dr;
conn.ConnectionString = strConn;
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
cmd.CommandText = strSPName;
cmd.Parameters.Add("tblName",OracleType.VarChar);//表å
cmd.Parameters.Add("strGetFields",OracleType.VarChar);//˜q”å›žå—æ®µå?br />
cmd.Parameters.Add("fldName",OracleType.VarChar);//排åºå—段å?br />
cmd.Parameters.Add("PageSize",OracleType.Number);//分页大å°
cmd.Parameters.Add("PageIndex",OracleType.Number);//™åëŠ
cmd.Parameters.Add("doCount",OracleType.Number);//是妾lŸè®¡æ€»è®°å½•æ•°
cmd.Parameters.Add("OrderType",OracleType.Number);//排庾cÕdž‹
cmd.Parameters.Add("strWhere",OracleType.VarChar);//½{›é€‰æ¡ä»?br />
cmd.Parameters.Add("DataCount",OracleType.Number);//˜q”回得记录æ€ÀL•°
cmd.Parameters.Add("DataSet",OracleType.Cursor);//˜q”回得记录集
cmd.Parameters["tblName"].Value = strTableName;
cmd.Parameters["strGetFields"].Value = strGetFields;
cmd.Parameters["fldName"].Value = strFieldName;
cmd.Parameters["PageSize"].Value = iPageSize;
cmd.Parameters["PageIndex"].Value = ( iOrderType == 0 ) ? (pager.PageCount+1-iPageIndex) : iPageIndex;//å› äØ“Oracleä¸ä¸æ”¯æŒå查询排åº?所以在˜q™é‡Œå¦‚果需è¦å€’åº,则将™åëŠ æŒ‰ååºå–æ•°æ®,"以å‡ä¹ÞqœŸ".嘿嘿!
cmd.Parameters["doCount"].Value = iDoCount;
cmd.Parameters["OrderType"].Value = iOrderType;
cmd.Parameters["strWhere"].Value = strWhere;
cmd.Parameters["DataCount"].Direction = ParameterDirection.Output;
cmd.Parameters["DataSet"].Direction = ParameterDirection.Output;
cmd.Parameters["tblName"].Size = 100;
cmd.Parameters["strGetFields"].Size = 1000;
cmd.Parameters["fldName"].Size = 100;
cmd.Parameters["strWhere"].Size = 1000;
//try
{
switch (iDoCount)
{
case 0:
{
dr = cmd.ExecuteReader();
dgData.DataSource = dr;
dgData.DataBind();//¾l‘å®šæ•°æ®æº?br />
dr.Close();
break;
}
case 1:
{
cmd.ExecuteOracleScalar();
pager.RecordCount = int.Parse(cmd.Parameters["DataCount"].Value.ToString());
break;
}
}
}
//catch
{
}
conn.Close();
}
2.调用
A.™åµé¢åŠ è²æ—¶å€™å–得总记录数,以绑定分™å‰|ާä»?/p>
private void Page_Load(object src,EventArgs e)
{
if(!Page.IsPostBack)
{
string conn = "password=cqcj;user id=cqcj;data source=cqc1";
this.BuildData(conn,"CJ_PageData.CJ_GetDataByPage","CJ_Log","","",0,0,1,0,"UserID = 'xxr'");
BindData();//˜q™é‡Œ¾l™åˆ†™å‰|ާä»?如DataGrid¾l‘å®šæ•°æ®æº?br />
}
}
B.BindData()
protected void BindData()
{
string conn = "password=cqcj;user id=cqcj;data source=cqc1";
this.BuildData(conn,"CJ_PageData.CJ_GetDataByPage","CJ_Log","*","LoginTime",pager.PageSize,pager.CurrentPageIndex,0,1,"UserID = 'xxr'");
pager.CustomInfoText="记录æ€ÀL•°åQ?lt;font color=\"blue\"><b>"+pager.RecordCount.ToString()+"</b></font>";
pager.CustomInfoText+=" 总页敎ͼš<font color=\"blue\"><b>"+pager.PageCount.ToString()+"</b></font>";
pager.CustomInfoText+=" 当剙åµï¼š<font color=\"red\"><b>"+pager.CurrentPageIndex.ToString()+"</b></font>";
}
å›?æ€È»“
Oracle䏿— 法直接返回记录集,éœ€åˆ©ç”¨æ¸¸æ ‡˜q”回.Oracleä¸ä¸æ”¯æŒå查询排åº?临时表耗费资æºä¸æŽ¨èä‹Éç”?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=940779
if exists (select name from sysobjects where name='v_order' and type='p')
DROP PROCEDURE v_order
go
create procedure v_order
 @serverid varchar(30),
 @jtype  int
 as
 select * from
 order_form
where jtype= @jtype and serverid=@serverid
select * from sysobjects where type='p' and name='v_order'
exec v_order 'hcair','3'
go
exec v_order hcair,3
exec v_order @serverid=hcair,@jtype=3
drop proc v_order_in
go
create procedure v_order_in
@user_name varchar(20),
@pnr_list varchar(20),
@air_list varchar(20),
@arri_list varchar(20),
@dp_time   timestamp,
@lxname  varchar(20)
as
insert into order_form(user_name,pnr_list,air_list,arri_list,dp_time,lxname) values (@user_name,@pnr_list,@air_list,@arri_list,@dp_time,@lxname )
go
exec v_order_in 0000,rksts,MF8587,'KHN,PEK,',convert('2006-7-16 13:03:53'),linsanfu
-------------------------------------------------------------------------------------------------------------------------------------------------------
½CÞZ¾‹
A. ä½¿ç”¨å¸¦æœ‰å¤æ‚ SELECT è¯å¥çš„简å•过½E?br />下é¢çš„å˜å‚¨è¿‡½E‹ä»Žå››ä¸ªè¡¨çš„è”æŽ¥ä¸è¿”回所有作者(æä¾›äº†å§“å)ã€å‡ºç‰ˆçš„书ç±ä»¥åŠå‡ºç‰ˆ½C¾ã€‚该å˜å‚¨˜q‡ç¨‹ä¸ä‹É用ä“Q何傿•°ã€?/p>
USE pubs
IF EXISTS (SELECT name FROM sysobjects
        WHERE name = 'au_info_all' AND type = 'P')
  DROP PROCEDURE au_info_all
GO
CREATE PROCEDURE au_info_all
AS
SELECT au_lname, au_fname, title, pub_name
  FROM authors a INNER JOIN titleauthor ta
     ON a.au_id = ta.au_id INNER JOIN titles t
     ON t.title_id = ta.title_id INNER JOIN publishers p
     ON t.pub_id = p.pub_id
GO
au_info_all å˜å‚¨˜q‡ç¨‹å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–ÒŽ³•执行åQ?/p>
EXECUTE au_info_all
-- Or
EXEC au_info_all
如果该过½E‹æ˜¯æ‰¹å¤„ç†ä¸çš„第一æ¡è¯å¥ï¼Œåˆ™å¯ä½¿ç”¨åQ?/p>
au_info_all
B. ä½¿ç”¨å¸¦æœ‰å‚æ•°çš„简å•过½E?br />下é¢çš„å˜å‚¨è¿‡½E‹ä»Žå››ä¸ªè¡¨çš„è”æŽ¥ä¸åª˜q”回指定的作者(æä¾›äº†å§“å)ã€å‡ºç‰ˆçš„书ç±ä»¥åŠå‡ºç‰ˆ½C¾ã€‚该å˜å‚¨˜q‡ç¨‹æŽ¥å—ä¸Žä¼ é€’çš„å‚æ•°¾_„¡¡®åŒšw…的倹{€?/p>
USE pubs
IF EXISTS (SELECT name FROM sysobjects
        WHERE name = 'au_info' AND type = 'P')
  DROP PROCEDURE au_info
GO
USE pubs
GO
CREATE PROCEDURE au_info
  @lastname varchar(40),
  @firstname varchar(20)
AS
SELECT au_lname, au_fname, title, pub_name
  FROM authors a INNER JOIN titleauthor ta
     ON a.au_id = ta.au_id INNER JOIN titles t
     ON t.title_id = ta.title_id INNER JOIN publishers p
     ON t.pub_id = p.pub_id
  WHERE au_fname = @firstname
     AND au_lname = @lastname
GO
au_info å˜å‚¨˜q‡ç¨‹å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–ÒŽ³•执行åQ?/p>
EXECUTE au_info 'Dull', 'Ann'
-- Or
EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
-- Or
EXEC au_info 'Dull', 'Ann'
-- Or
EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXEC au_info @firstname = 'Ann', @lastname = 'Dull'
如果该过½E‹æ˜¯æ‰¹å¤„ç†ä¸çš„第一æ¡è¯å¥ï¼Œåˆ™å¯ä½¿ç”¨åQ?/p>
au_info 'Dull', 'Ann'
-- Or
au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
au_info @firstname = 'Ann', @lastname = 'Dull'
C. 使用带有通酽W¦å‚æ•°çš„½Ž€å•过½E?br />下é¢çš„å˜å‚¨è¿‡½E‹ä»Žå››ä¸ªè¡¨çš„è”æŽ¥ä¸åª˜q”回指定的作者(æä¾›äº†å§“å)ã€å‡ºç‰ˆçš„书ç±ä»¥åŠå‡ºç‰ˆ½C¾ã€‚该å˜å‚¨˜q‡ç¨‹å¯¹ä¼ é€’çš„å‚æ•°˜q›è¡Œæ¨¡å¼åŒšw…åQŒå¦‚果没有æä¾›å‚敎ͼŒåˆ™ä‹É用预讄¡š„默认倹{€?/p>
USE pubs
IF EXISTS (SELECT name FROM sysobjects
     WHERE name = 'au_info2' AND type = 'P')
  DROP PROCEDURE au_info2
GO
USE pubs
GO
CREATE PROCEDURE au_info2
  @lastname varchar(30) = 'D%',
  @firstname varchar(18) = '%'
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
  ON a.au_id = ta.au_id INNER JOIN titles t
  ON t.title_id = ta.title_id INNER JOIN publishers p
  ON t.pub_id = p.pub_id
WHERE au_fname LIKE @firstname
  AND au_lname LIKE @lastname
GO
au_info2 å˜å‚¨˜q‡ç¨‹å¯ä»¥ç”¨å¤š¿Uç»„åˆæ‰§è¡Œã€‚下é¢åªåˆ—出了部分组åˆï¼š
EXECUTE au_info2
-- Or
EXECUTE au_info2 'Wh%'
-- Or
EXECUTE au_info2 @firstname = 'A%'
-- Or
EXECUTE au_info2 '[CK]ars[OE]n'
-- Or
EXECUTE au_info2 'Hunter', 'Sheryl'
-- Or
EXECUTE au_info2 'H%', 'S%'
D. 使用 OUTPUT 傿•°
OUTPUT 傿•°å…许外部˜q‡ç¨‹ã€æ‰¹å¤„ç†æˆ–多æ?Transact-SQL è¯å¥è®‰K—®åœ¨è¿‡½E‹æ‰§è¡ŒæœŸé—´è®¾¾|®çš„æŸä¸ªå€¹{€‚下é¢çš„½CÞZ¾‹åˆ›å¾ä¸€ä¸ªå˜å‚¨è¿‡½E?(titles_sum)åQŒåƈ使用一个å¯é€‰çš„è¾“å…¥å‚æ•°å’Œä¸€ä¸ªè¾“å‡ºå‚æ•°ã€?/p>
首先åQŒåˆ›å»ø™¿‡½E‹ï¼š
USE pubs
GO
IF EXISTS(SELECT name FROM sysobjects
     WHERE name = 'titles_sum' AND type = 'P')
  DROP PROCEDURE titles_sum
GO
USE pubs
GO
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%', @@SUM money OUTPUT
AS
SELECT 'Title Name' = title
FROM titles
WHERE title LIKE @@TITLE
SELECT @@SUM = SUM(price)
FROM titles
WHERE title LIKE @@TITLE
GO
接下æ¥ï¼Œž®†è¯¥ OUTPUT 傿•°ç”¨äºŽæŽ§åˆ¶‹¹è¯a€ã€?
Â
说明 OUTPUT å˜é‡å¿…é¡»åœ¨åˆ›å»ø™¡¨å’Œä‹É用该å˜é‡æ—‰™ƒ½˜q›è¡Œå®šä¹‰ã€?/p>
傿•°åå’Œå˜é‡åä¸ä¸€å®šè¦åŒšw…åQŒä¸˜q‡æ•°æ®ç±»åž‹å’Œå‚æ•°ä½ç½®å¿…须匚w…åQˆé™¤éžä‹Éç”?@@SUM = variable å½¢å¼åQ‰ã€?
DECLARE @@TOTALCOST money
EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
IF @@TOTALCOST < 200
BEGIN
  PRINT ' '
  PRINT 'All of these titles can be purchased for less than $200.'
END
ELSE
  SELECT 'The total cost of these titles is $'
        + RTRIM(CAST(@@TOTALCOST AS varchar(20)))
䏋颿˜¯ç»“果集åQ?/p>
Title Name                                                             Â
------------------------------------------------------------------------
The Busy Executive's Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking
(3 row(s) affected)
Warning, null value eliminated from aggregate.
Â
All of these titles can be purchased for less than $200.
E. 使用 OUTPUT æ¸¸æ ‡å‚æ•°
OUTPUT æ¸¸æ ‡å‚æ•°ç”¨æ¥ž®†å˜å‚¨è¿‡½E‹çš„å±€éƒ¨æ¸¸æ ‡ä¼ é€’å›žè°ƒç”¨æ‰¹å¤„ç†ã€å˜å‚¨è¿‡½E‹æˆ–触å‘器ã€?/p>
首先åQŒåˆ›å»ÞZ»¥ä¸‹è¿‡½E‹ï¼Œåœ?titles 表上声明òq¶æ‰“å¼€ä¸€ä¸ªæ¸¸æ ‡ï¼š
USE pubs
IF EXISTS (SELECT name FROM sysobjects
     WHERE name = 'titles_cursor' and type = 'P')
DROP PROCEDURE titles_cursor
GO
CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
AS
SET @titles_cursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT *
FROM titles
OPEN @titles_cursor
GO
接下æ¥ï¼Œæ‰§è¡Œä¸€ä¸ªæ‰¹å¤„ç†åQŒå£°æ˜Žä¸€ä¸ªå±€éƒ¨æ¸¸æ ‡å˜é‡ï¼Œæ‰§è¡Œä¸Šè¿°˜q‡ç¨‹ä»¥å°†æ¸¸æ ‡èµ‹å€¼ç»™å±€éƒ¨å˜é‡ï¼Œç„¶åŽä»Žè¯¥æ¸¸æ ‡æå–行ã€?/p>
USE pubs
GO
DECLARE @MyCursor CURSOR
EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
WHILE (@@FETCH_STATUS = 0)
BEGIN
  FETCH NEXT FROM @MyCursor
END
CLOSE @MyCursor
DEALLOCATE @MyCursor
GO
F. 使用 WITH RECOMPILE 选项
å¦‚æžœä¸ø™¿‡½E‹æä¾›çš„傿•°ä¸æ˜¯å…¸åž‹çš„傿•ŽÍ¼Œòq¶ä¸”新的执行计划ä¸åº”é«˜é€Ÿç¼“å˜æˆ–å˜å‚¨åœ¨å†…å˜ä¸åQŒWITH RECOMPILE åå¥ä¼šå¾ˆæœ‰å¸®åŠ©ã€?/p>
USE pubs
IF EXISTS (SELECT name FROM sysobjects
     WHERE name = 'titles_by_author' AND type = 'P')
  DROP PROCEDURE titles_by_author
GO
CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = '%'
WITH RECOMPILE
AS
SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS 'Authors full name',
  title AS Title
FROM authors a INNER JOIN titleauthor ta
  ON a.au_id = ta.au_id INNER JOIN titles t
  ON ta.title_id = t.title_id
WHERE au_lname LIKE @@LNAME_PATTERN
GO
G. 使用 WITH ENCRYPTION 选项
WITH ENCRYPTION åå¥å¯¹ç”¨æˆ·éšè—å˜å‚¨è¿‡½E‹çš„æ–‡æœ¬ã€‚ä¸‹ä¾‹åˆ›å»ºåŠ å¯†è¿‡½E‹ï¼Œä½¿ç”¨ sp_helptext ¾pÈ»Ÿå˜å‚¨˜q‡ç¨‹èŽ·å–å…³äºŽåŠ å¯†˜q‡ç¨‹çš„ä¿¡æ¯ï¼Œç„¶åŽž®è¯•直接ä»?syscomments 表ä¸èŽ·å–关于该过½E‹çš„ä¿¡æ¯ã€?/p>
IF EXISTS (SELECT name FROM sysobjects
     WHERE name = 'encrypt_this' AND type = 'P')
  DROP PROCEDURE encrypt_this
GO
USE pubs
GO
CREATE PROCEDURE encrypt_this
WITH ENCRYPTION
AS
SELECT *
FROM authors
GO
EXEC sp_helptext encrypt_this
䏋颿˜¯ç»“果集åQ?/p>
The object's comments have been encrypted.
接下æ¥ï¼Œé€‰æ‹©åР坆å˜å‚¨˜q‡ç¨‹å†…å®¹çš„æ ‡è¯†å·å’Œæ–‡æœ¬ã€?/p>
SELECT c.id, c.text
FROM syscomments c INNER JOIN sysobjects o
  ON c.id = o.id
WHERE o.name = 'encrypt_this'
䏋颿˜¯ç»“果集åQ?/p>
Â
说明 text 列的输出昄¡¤ºåœ¨å•独一行ä¸ã€‚执行时åQŒè¯¥ä¿¡æ¯ž®†ä¸Ž id 列信æ¯å‡ºçŽ°åœ¨åŒä¸€è¡Œä¸ã€?/p>
id        text                                                      Â
---------- ------------------------------------------------------------
1413580074 ?????????????????????????????????e??????????????????????????????????????????????????????????????????????????
(1 row(s) affected)
H. 创å¾ç”¨æˆ·å®šä¹‰çš„ç³»¾lŸå˜å‚¨è¿‡½E?br />下é¢çš„示例创å»ÞZ¸€ä¸ªè¿‡½E‹ï¼Œæ˜„¡¤ºè¡¨åä»?emp 开头的所有表åŠå…¶å¯¹åº”çš„çƒ¦å¼•ã€‚å¦‚æžœæ²¡æœ‰æŒ‡å®šå‚æ•ŽÍ¼Œè¯¥è¿‡½E‹å°†˜q”回表åä»?sys 开头的所有表åQˆåŠç´¢å¼•åQ‰ã€?/p>
IF EXISTS (SELECT name FROM sysobjects
     WHERE name = 'sp_showindexes' AND type = 'P')
  DROP PROCEDURE sp_showindexes
GO
USE master
GO
CREATE PROCEDURE sp_showindexes
  @@TABLE varchar(30) = 'sys%'
AS
SELECT o.name AS TABLE_NAME,
  i.name AS INDEX_NAME,
  indid AS INDEX_ID
FROM sysindexes i INNER JOIN sysobjects o
  ON o.id = i.id
WHERE o.name LIKE @@TABLE
GOÂ Â Â Â Â Â Â Â
USE pubs
EXEC sp_showindexes 'emp%'
GO
䏋颿˜¯ç»“果集åQ?/p>
TABLE_NAMEÂ Â Â Â Â Â INDEX_NAMEÂ Â Â Â Â Â INDEX_ID
---------------- ---------------- ----------------
employee        employee_ind    1
employee        PK_emp_id       2
(2 row(s) affected)
I. 使用延迟åç§°è§£æž
下é¢çš„示例显½Cºå››ä¸ªè¿‡½E‹ä»¥åŠåšg˜qŸå¿U°è§£æžçš„å„ç§å¯èƒ½ä½¿ç”¨æ–¹å¼ã€‚å°½½Ž¡å¼•用的表或列在¾~–译时ä¸å˜åœ¨åQŒä½†æ¯ä¸ªå˜å‚¨˜q‡ç¨‹éƒ½å¯åˆ›å¾ã€?/p>
IF EXISTS (SELECT name FROM sysobjects
     WHERE name = 'proc1' AND type = 'P')
  DROP PROCEDURE proc1
GO
-- Creating a procedure on a nonexistent table.
USE pubs
GO
CREATE PROCEDURE proc1
AS
  SELECT *
  FROM does_not_exist
GOÂ
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
  ON o.id = c.id
WHERE o.type = 'P' AND o.name = 'proc1'
GO
USE master
GO
IF EXISTS (SELECT name FROM sysobjects
     WHERE name = 'proc2' AND type = 'P')
  DROP PROCEDURE proc2
GO
-- Creating a procedure that attempts to retrieve information from a
-- nonexistent column in an existing table.
USE pubs
GO
CREATE PROCEDURE proc2
AS
  DECLARE @middle_init char(1)
  SET @middle_init = NULL
  SELECT au_id, middle_initial = @middle_init
  FROM authors
GOÂ
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
  ON o.id = c.id
WHERE o.type = 'P' and o.name = 'proc2'
Â
4.3.2 ‹¹®ç‚¹æ•°æ®¾cÕdž‹
   ‹¹®ç‚¹æ•°æ®¾cÕdž‹ç”¨äºŽå˜å‚¨åè¿›åˆ¶å°æ•°ã€‚æÕQç‚ÒŽ•°å€¼çš„æ•°æ®åœ¨SQL Server ä¸é‡‡ç”¨ä¸Šèˆå…¥åQˆRound up 或称为åªå…¥ä¸èˆï¼‰æ–¹å¼˜q›è¡Œå˜å‚¨ã€‚所谓上èˆå…¥æ˜¯æŒ‡åQŒå½“åQˆä¸”仅当åQ‰è¦èˆå…¥çš„æ•°æ˜¯ä¸€ä¸ªéžé›¶æ•°æ—Óž¼Œå¯¹å…¶ä¿ç•™æ•°å—部分的最低有效ä½ä¸Šçš„æ•°å€¼åŠ 1 åQŒåƈ˜q›è¡Œå¿…è¦çš„è¿›ä½ã€‚若一个数是上èˆå…¥æ•ŽÍ¼Œå…¶ç»å¯¹å€ég¸ä¼šå‡ž®‘。如åQšå¯¹3.14159265358979 分别˜q›è¡Œ2 ä½å’Œ12ä½èˆå…¥ï¼Œ¾l“æžœä¸?.15 å’?.141592653590ã€?br />    1ã€REAL 数殾cÕdž‹
REAL数殾cÕdž‹å¯ç²¾¼‹®åˆ°½W? ä½å°æ•ŽÍ¼Œå…¶èŒƒå›´äØ“ä»?3.40E -38 åˆ?.40E +38ã€?æ¯ä¸ªREAL¾cÕdž‹çš„æ•°æ®å ç”? 个å—节的å˜å‚¨½Iºé—´ã€?br />    2ã€FLOAT
FLOAT数殾cÕdž‹å¯ç²¾¼‹®åˆ°½W?5 ä½å°æ•ŽÍ¼Œå…¶èŒƒå›´äØ“ä»?1.79E -308 åˆ?.79E +308ã€?æ¯ä¸ªFLOAT ¾cÕdž‹çš„æ•°æ®å ç”? 个å—节的å˜å‚¨½Iºé—´ã€?FLOAT数殾cÕdž‹å¯å†™ä¸ºFLOAT[ n ]çš„åÅžå¼ã€‚n 指定FLOAT æ•°æ®çš„精度。n ä¸?åˆ?5 之间的整数倹{€‚当n å? åˆ? æ—Óž¼Œå®žé™…上是定义了一个REAL ¾cÕdž‹çš„æ•°æ®ï¼Œ¾pÈ»Ÿç”? 个å—节å˜å‚¨å®ƒåQ›å½“n å? åˆ?5 æ—Óž¼Œ¾pÈ»Ÿè®¤äؓ其是FLOAT ¾cÕdž‹åQŒç”¨8 个å—节å˜å‚¨å®ƒã€?br />    3ã€DECIMAL
DECIMAL数殾cÕdž‹å¯ä»¥æä¾›ž®æ•°æ‰€éœ€è¦çš„实际å˜å‚¨½Iºé—´åQŒä½†ä¹Ÿæœ‰ä¸€å®šçš„é™åˆ¶åQŒæ‚¨å¯ä»¥ç”? åˆ?7 个å—节æ¥å˜å‚¨ä»?10çš?8‹Æ¡æ–¹-1 åˆ?0çš?8‹Æ¡æ–¹-1 之间的数倹{€‚寞®†å…¶å†™äØ“DECIMAL[ p [s] ]çš„åÅžå¼ï¼Œp å’Œs ¼‹®å®šäº†ç²¾¼‹®çš„æ¯”例和数ä½ã€‚å…¶ä¸p 表示å¯ä¾›å˜å‚¨çš„值的æ€ÖM½æ•ŽÍ¼ˆä¸åŒ…æ‹¬å°æ•°ç‚¹åQ‰ï¼Œ¾~ºçœå€égØ“18åQ?s 表示ž®æ•°ç‚¹åŽçš„使•ŽÍ¼Œ¾~ºçœå€égØ“0ã€?例如åQšdecimal åQ?5 5åQ‰ï¼Œè¡¨ç¤ºå…±æœ‰15 使•°åQŒå…¶ä¸æ•´æ•?0 ä½ï¼Œž®æ•°5ã€?ä½è¡¨4-3 列出了儾_„¡¡®åº¦æ‰€éœ€çš„å—节数之间的关¾p…R€?br />Â
    4ã€NUMERIC
NUMERIC数殾cÕdž‹ä¸ŽDECIMAL数殾cÕdž‹å®Œå…¨ç›¸åŒã€?br />注æ„åQšSQL Server ä¸ÞZº†å’Œå‰ç«¯çš„å¼€å‘工具é…åˆï¼Œå…¶æ‰€æ”¯æŒçš„æ•°æ®ç²¾åº¦é»˜è®¤æœ€å¤§äØ“28ä½ã€‚但å¯ä»¥é€šè¿‡ä½¿ç”¨å‘½ä×oæ¥æ‰§è¡Œsqlserver.exe½E‹åºä»¥å¯åЍSQL ServeråQŒå¯æ”¹å˜é»˜è®¤¾_‘Öº¦ã€‚å‘½ä»¤è¯æ³•如下:SQLSERVR[/D master_device_path][/P precisim_leve1]
   ä¾?-4: 用最大数æ®ç²¾åº?8 å¯åЍSQL Server
sqlservr /d c:\ Mssql2000\data\master.dat /p38
/*在ä‹É用了/P 傿•°å?å¦‚æžœå…¶åŽæ²¡æœ‰æŒ‡å®šå…·ä½“的精度数å€?åˆ™é»˜è®¤äØ“38 ä½?/*
4.3.3 二进制数æ®ç±»åž?br />    1ã€BINARY
BINARY 数殾cÕdž‹ç”¨äºŽå˜å‚¨äºŒè¿›åˆ¶æ•°æ®ã€‚其定义形å¼ä¸ºBINARYåQ?nåQ‰ï¼Œ n 表示数æ®çš„长度,å–å€égØ“1 åˆ?000 。在使用时必™åÀLŒ‡å®šBINARY ¾cÕdž‹æ•°æ®çš„大ž®ï¼Œè‡›_°‘åº”äØ“1 个å—节。BINARY ¾cÕdž‹æ•°æ®å 用n+4 个å—节的å˜å‚¨½Iºé—´ã€‚åœ¨è¾“å…¥æ•°æ®æ—¶å¿…™åÕdœ¨æ•°æ®å‰åŠ ä¸Šå—½W¦â€?Xâ€?ä½œäØ“äºŒè¿›åˆ¶æ ‡è¯†ï¼Œå¦‚ï¼šè¦è¾“入“abc â€åˆ™åº”输入â€?xabc â€ã€‚若输入的数æ®è¿‡é•¿å°†ä¼šæˆªæŽ‰å…¶‘…出部分。若输入的数æ®ä½æ•îCؓ奇数åQŒåˆ™ä¼šåœ¨èµ·å§‹½W¦å·â€?X â€åŽæ·ÕdР䏀ä¸?åQŒå¦‚上述的â€?xabc â€ä¼šè¢«ç³»¾lŸè‡ªåЍå˜ä¸ºâ€?x0abcâ€ã€?
    2ã€VARBINARY
VARBINARY数殾cÕdž‹çš„定义åÅžå¼äØ“VARBINARYåQˆnåQ‰ã€?它与BINARY ¾cÕdž‹ç›æ€¼¼åQŒn çš„å–å€ég¹Ÿä¸? åˆ?000åQ?若输入的数殘q‡é•¿åQŒå°†ä¼šæˆªæŽ‰å…¶‘…出部分。ä¸åŒçš„æ˜¯VARBINARY数殾cÕdž‹å…ähœ‰å˜åŠ¨é•¿åº¦çš„ç‰¹æ€§ï¼Œå› äØ“VARBINARY数殾cÕdž‹çš„å˜å‚¨é•¿åº¦äؓ实际数值长åº?4个å—节。当BINARY数殾cÕdž‹å…许NULL 值时åQŒå°†è¢«è§†ä¸ºVARBINARY数殾cÕdž‹ã€?br />一般情况下åQŒç”±äºŽBINARY 数殾cÕdž‹é•¿åº¦å›ºå®šåQŒå› æ¤å®ƒæ¯”VARBINARY ¾cÕdž‹çš„处ç†é€Ÿåº¦å¿«ã€?/p>
4.3.4 逻辑数殾cÕdž‹
   BITåQ?BIT数殾cÕdž‹å 用1 个å—节的å˜å‚¨½Iºé—´åQŒå…¶å€égØ“0 æˆ? 。如果输å…? æˆ? 以外的å€û|¼Œž®†è¢«è§†äØ“1ã€?BIT ¾cÕdž‹ä¸èƒ½å®šä¹‰ä¸ºNULL å€û|¼ˆæ‰€è°“NULL å€¼æ˜¯æŒ‡ç©ºå€¼æˆ–æ— æ„义的å€û|¼‰ã€?/p>
4.3.5 å—符数殾cÕdž‹
   å—符数殾cÕdž‹æ˜¯ä‹É用最多的数殾cÕdž‹ã€‚它å¯ä»¥ç”¨æ¥å˜å‚¨å„ç§å—æ¯ã€æ•°å—符å—÷€ç‰¹ŒDŠç¬¦å—÷€‚一般情况下åQŒä‹É用嗽W¦ç±»åž‹æ•°æ®æ—¶™åÕdœ¨å…¶å‰åŽåŠ ä¸Šå•引å·â€™æˆ–åŒå¼•å·â€?ã€?
    1 CHAR
CHAR 数殾cÕdž‹çš„定义åÅžå¼äØ“CHAR[ åQˆnåQ?]ã€?以CHAR ¾cÕdž‹å˜å‚¨çš„æ¯ä¸ªå—½W¦å’Œ½W¦å·å 一个å—节的å˜å‚¨½Iºé—´ã€‚n 表示所有嗽W¦æ‰€å çš„å˜å‚¨½Iºé—´åQŒn çš„å–å€égØ“1 åˆ?000åQ?å›_¯å®¹çº³8000 个ANSI å—ç¬¦ã€‚è‹¥ä¸æŒ‡å®šn å€û|¼Œåˆ™ç³»¾lŸé»˜è®¤å€égØ“1ã€?若输入数æ®çš„å—符数å°äºŽnåQŒåˆ™¾pÈ»Ÿè‡ªåŠ¨åœ¨å…¶åŽæ·»åŠ ç©ºæ ¼æ¥å¡«æ»¡è®‘Ö®šå¥½çš„½Iºé—´ã€‚若输入的数æ®è¿‡é•¿ï¼Œž®†ä¼šæˆªæŽ‰å…¶è¶…出部分ã€?br />    2ã€NCHAR
NCHAR数殾cÕdž‹çš„定义åÅžå¼äØ“NCHAR[ åQˆnåQ?]ã€?它与CHAR ¾cÕdž‹ç›æ€¼¼ã€‚ä¸åŒçš„æ˜¯NCHAR数殾cÕdž‹n çš„å–å€égØ“1 åˆ?000ã€?å› äØ“NCHAR ¾cÕdž‹é‡‡ç”¨UNICODE æ ‡å‡†å—符集(CharacterSetåQ‰ã€?UNICODE æ ‡å‡†è§„å®šæ¯ä¸ªå—符å 用两个å—节的å˜å‚¨ç©ºé—ß_¼Œæ‰€ä»¥å®ƒæ¯”éžUNICODE æ ‡å‡†çš„æ•°æ®ç±»åž‹å¤šå 用一å€çš„å˜å‚¨½Iºé—´ã€‚ä‹É用UNICODE æ ‡å‡†çš„å¥½å¤„æ˜¯å› å…¶ä½¿ç”¨ä¸¤ä¸ªå—节åšå˜å‚¨å•ä½ï¼Œå…¶ä¸€ä¸ªå˜å‚¨å•ä½çš„容纳é‡å°±å¤§å¤§å¢žåŠ äº†ï¼Œå¯ä»¥ž®†å…¨ä¸–界的è¯a€æ–‡å—都囊括在内,在一个数æ®åˆ—ä¸å°±å¯ä»¥åŒæ—¶å‡ºçް䏿–‡ã€è‹±æ–‡ã€æ³•æ–‡ã€å¯dæ–‡ç‰åQŒè€Œä¸ä¼šå‡ºçŽ°ç¼–ç 冲½Hã€?br />    3ã€VARCHAR
VARCHAR数殾cÕdž‹çš„定义åÅžå¼äØ“VARCHAR [ åQˆnåQ?]ã€?它与CHAR ¾cÕdž‹ç›æ€¼¼åQŒn çš„å–å€ég¹Ÿä¸? åˆ?000åQ?若输入的数殘q‡é•¿åQŒå°†ä¼šæˆªæŽ‰å…¶‘…出部分。ä¸åŒçš„æ˜¯ï¼ŒVARCHAR数殾cÕdž‹å…ähœ‰å˜åŠ¨é•¿åº¦çš„ç‰¹æ€§ï¼Œå› äØ“VARCHAR数殾cÕdž‹çš„å˜å‚¨é•¿åº¦äؓ实际数值长度,若输入数æ®çš„å—符数å°äºŽn åQŒåˆ™¾pÈ»Ÿä¸ä¼šåœ¨å…¶åŽæ·»åŠ ç©ºæ ¼æ¥å¡«æ»¡è®‘Ö®šå¥½çš„½Iºé—´ã€?br />一般情况下åQŒç”±äºŽCHAR 数殾cÕdž‹é•¿åº¦å›ºå®šåQŒå› æ¤å®ƒæ¯”VARCHAR ¾cÕdž‹çš„处ç†é€Ÿåº¦å¿«ã€?br />    4ã€NVARCHAR
NVARCHAR数殾cÕdž‹çš„定义åÅžå¼äØ“NVARCHAR[ åQˆnåQ?]ã€?它与VARCHAR ¾cÕdž‹ç›æ€¼¼ã€‚ä¸åŒçš„æ˜¯ï¼ŒNVARCHAR数殾cÕdž‹é‡‡ç”¨UNICODE æ ‡å‡†å—符集(Character SetåQ‰ï¼Œ n çš„å–å€égØ“1 åˆ?000ã€?/p>
4.3.6 文本和图形数æ®ç±»åž?br />   ˜q™ç±»æ•°æ®¾cÕdž‹ç”¨äºŽå˜å‚¨å¤§é‡çš„å—½W¦æˆ–二进制数æ®ã€?br />    1ã€TEXT
TEXT数殾cÕdž‹ç”¨äºŽå˜å‚¨å¤§é‡æ–‡æœ¬æ•°æ®åQŒå…¶å®šw‡ç†è®ºä¸ŠäØ“1 åˆ?çš?1‹Æ¡æ–¹-1 åQ?åQ?147åQ?483åQ?647åQ‰ä¸ªå—节åQŒåœ¨å®žé™…应用旉™œ€è¦è§†¼‹¬ç›˜çš„å˜å‚¨ç©ºé—´è€Œå®šã€?br />SQL Server 2000 以å‰çš„版本ä¸åQŒæ•°æ®åº“ä¸ä¸€ä¸ªTEXT 对象å˜å‚¨çš„实际上是一个指针,它指å‘一个个ä»?KB åQ?192 个å—节)为å•ä½çš„æ•°æ®™åµï¼ˆData PageåQ‰ã€?˜q™äº›æ•°æ®™å‰|˜¯åЍæ€å¢žåŠ åÆˆè¢«é€»è¾‘é“¾æŽ¥èµäh¥çš„。在SQL Server 2000 ä¸ï¼Œåˆ™å°†TEXT å’ŒIMAGE ¾cÕdž‹çš„æ•°æ®ç›´æŽ¥å˜æ”‘Öˆ°è¡¨çš„æ•°æ®è¡Œä¸åQŒè€Œä¸æ˜¯å˜æ”‘Öˆ°ä¸åŒçš„æ•°æ®é¡µä¸ã€?˜q™å°±å‡å°‘了用于å˜å‚¨TEXT å’ŒIMA- GE ¾cÕdž‹çš„空é—ß_¼Œòq¶ç›¸åº”凞®‘了¼‚盘处熘q™ç±»æ•°æ®çš„I/O æ•°é‡ã€?br />   2 NTEXT
NTEXT数殾cÕdž‹ä¸ŽTEXT.¾cÕdž‹ç›æ€¼¼ä¸åŒçš?是NTEXT ¾cÕdž‹é‡‡ç”¨UNICODE æ ‡å‡†å—符é›?Character Set), å› æ¤å…¶ç†è®ºå®¹é‡äØ“230-1(1, 073, 741, 823)个å—节ã€?br />   3 IMAGE
IMAGE数殾cÕdž‹ç”¨äºŽå˜å‚¨å¤§é‡çš„二˜q›åˆ¶æ•°æ®Binary Dataã€?å…¶ç†è®ºå®¹é‡äØ“2çš?1‹Æ¡æ–¹-1(2,147,483,647)个å—节。其å˜å‚¨æ•°æ®çš„æ¨¡å¼ä¸ŽTEXT 数殾cÕdž‹ç›¸åŒã€‚通常用æ¥å˜å‚¨å›‘ÖÅž½{‰OLE Object Linking and EmbeddingåQŒå¯¹è±¡è¿žæŽ¥å’ŒåµŒå…¥åQ‰å¯¹è±¡ã€‚åœ¨è¾“å…¥æ•°æ®æ—¶åŒBINARY数殾cÕdž‹ä¸€æ øP¼Œå¿…须在数æ®å‰åŠ ä¸Šå—符â€?Xâ€ä½œä¸ÞZºŒ˜q›åˆ¶æ ‡è¯†
4.3.7 日期和时间数æ®ç±»åž?br />   1 DATETIME
DATETIME 数殾cÕdž‹ç”¨äºŽå˜å‚¨æ—¥æœŸå’Œæ—¶é—´çš„¾l“åˆä½“。它å¯ä»¥å˜å‚¨ä»Žå…¬å…?753 òq? æœ? 日零时è“v到公å…?999 òq?2 æœ?1 æ—?3 æ—?9 åˆ?9 ¿U’之间的所有日期和旉™—´åQŒå…¶¾_„¡¡®åº¦å¯è¾¾ä¸‰ç™‘Öˆ†ä¹‹ä¸€¿U’,å?.33 毫秒。DATETIME 数殾cÕdž‹æ‰€å 用的å˜å‚¨ç©ºé—´äØ“8 个å—节。其ä¸å‰4 个å—节用于å˜å‚?900 òq? æœ? æ—¥ä»¥å‰æˆ–以åŽçš„天敎ͼŒæ•°å€¼åˆ†æ£è´ŸåQŒæ£æ•°è¡¨½Cºåœ¨æ¤æ—¥æœŸä¹‹åŽçš„æ—¥æœŸåQŒè´Ÿæ•°è¡¨½Cºåœ¨æ¤æ—¥æœŸä¹‹å‰çš„æ—¥æœŸã€‚åŽ4 个å—节用于å˜å‚¨ä»Žæ¤æ—¥é›¶æ—¶èµäh‰€æŒ‡å®šçš„æ—¶é—´ç»˜q‡çš„æ¯«ç§’æ•°ã€‚å¦‚æžœåœ¨è¾“å…¥æ•°æ®æ—¶çœç•¥äº†æ—‰™—´éƒ¨åˆ†åQŒåˆ™¾pÈ»Ÿž®?2:00:00:000AMä½œäØ“æ—‰™—´¾~ºçœå€û|¼šå¦‚æžœçœç•¥äº†æ—¥æœŸéƒ¨åˆ†ï¼Œåˆ™ç³»¾lŸå°†1900 òq? æœ? 日作为日期缺çœå€¹{€?br />   2 SMALLDATETIME
SMALLDATETIME 数殾cÕdž‹ä¸ŽDATETIME 数殾cÕdž‹ç›æ€¼¼åQŒä½†å…¶æ—¥æœŸæ—¶é—´èŒƒå›´è¾ƒž®ï¼Œä¸ÞZ»Ž1900 òq? æœ? 日到2079 òq? æœ?åQšæ—¥¾_‘Öº¦è¾ƒä½ŽåQŒåªèƒ½ç²¾¼‹®åˆ°åˆ†é’ŸåQŒå…¶åˆ†é’Ÿä¸ªä½ä¸ŠäØ“æ ÒŽ®¿U’æ•°å››èˆäº”入的å€?å³ä»¥30 ¿U’äØ“ç•Œå››èˆäº”入。如åQšDATETIME æ—‰™—´ä¸?4:38:30.283
æ—¶SMALLDATETIME è®¤äØ“æ˜?4:39:00 SMALLDATETIME 数殾cÕdž‹ä½¿ç”¨4 个å—节å˜å‚¨æ•°æ®ã€‚å…¶ä¸å‰2 个å—节å˜å‚¨ä»ŽåŸºç¡€æ—¥æœŸ1900 òq? æœ? 日以æ¥çš„天数åQŒåŽä¸¤ä¸ªå—节å˜å‚¨æ¤æ—¥é›¶æ—¶èµäh‰€æŒ‡å®šçš„æ—¶é—´ç»˜q‡çš„分钟数ã€?br />   下é¢ä»‹ç»æ—¥æœŸå’Œæ—¶é—´çš„è¾“å…¥æ ¼å¼
Â Â Â æ—¥æœŸè¾“å…¥æ ¼å¼
Â Â Â æ—¥æœŸçš„è¾“å…¥æ ¼å¼å¾ˆå¤šå¤§è‡´å¯åˆ†äؓ三类åQ?
英文+æ•°å—æ ¼å¼
æ¤ç±»æ ¼å¼ä¸æœˆä»½å¯ç”¨è‹±æ–‡å…¨å或¾~©å†™åQŒä¸”ä¸åŒºåˆ†å¤§ž®å†™åQ›å¹´å’Œæœˆæ—¥ä¹‹é—´å¯ä¸ç”¨é€—å·åQ?br />òq´ä†¾å¯äØ“4 使ˆ–2 ä½ï¼›å½“å…¶ä¸ÞZ¸¤ä½æ—¶åQŒè‹¥å€¼å°äº?0 则视ä¸?0xx òqß_¼Œè‹¥å¤§äºŽæˆ–½{‰äºŽ50 åˆ?br />è§†äØ“19xx òqß_¼›è‹¥æ—¥éƒ¨åˆ†çœç•¥åQŒåˆ™è§†äؓ当月çš?å—÷€‚ä»¥ä¸‹æ ¼å¼å‡ä¸ºæ£¼‹®çš„æ—¥æœŸæ ¼å¼åQ?br />June 21 2000 Oct 1 1999 January 2000 2000 February
2000 May 1 2000 1 Sep 99 June July 00
æ•°å—+分隔½W¦æ ¼å¼?br />å…许把斜æ (/åQ‰ã€è¿žæŽ¥ç¬¦åQ?åQ‰å’Œž®æ•°ç‚¹ï¼ˆ.åQ‰ä½œä¸ºç”¨æ•°å—è¡¨ç¤ºçš„å¹´ã€æœˆã€æ—¥ä¹‹é—´çš„分
隔符。如åQ?br />YMDåQ?000/6/22 2000-6-22 2000.6.22
MDYåQ?/5/2000 3-5-2000 3.5.2000
DMYåQ?1/12/1999 31-12-1999 31.12.2000
¾U¯æ•°å—æ ¼å¼?br />¾U¯æ•°å—æ ¼å¼æ˜¯ä»¥è¿ž¾lçš„4 ä½?ã€ä½æˆ? 使•°å—æ¥è¡¨ç¤ºæ—¥æœŸã€‚如果输入的æ˜? 使ˆ–8 ä½?br />æ•°å—åQŒç³»¾lŸå°†æŒ‰å¹´ã€æœˆã€æ—¥æ¥è¯†åˆ«ï¼Œå³YMD æ ¼å¼åQŒåÆˆä¸”æœˆå’Œæ—¥éƒ½æ˜¯ç”¨ä¸¤ä½æ•°å—æ¥è¡¨ç¤ºåQ?br />å¦‚æžœè¾“å…¥çš„æ•°å—æ˜¯4 使•°åQŒç³»¾lŸè®¤ä¸ø™¿™4 使•°ä»£è¡¨òq´ä†¾,其月份和日缺çœäØ“æ¤å¹´åº¦çš„1 æœ?br />1 日。如:
20000601---2000 òq? æœ? æ—?991212---1999 òq?2 æœ?2 æ—?1998---1998 òq?
????
æ—‰™—´è¾“å…¥æ ¼å¼
åœ¨è¾“å…¥æ—¶é—´æ—¶å¿…é¡»æŒ‰â€œå°æ—¶ã€åˆ†é’Ÿã€ç§’ã€æ¯«¿U’â€çš„™åºåºæ¥è¾“入。在光™—´ç”¨å†’å·â€œï¼šâ€éš”开。但å¯å°†æ¯«ç§’éƒ¨åˆ†ç”¨å°æ•°ç‚¹â€?â€?分,隔其åŽç¬¬ä¸€ä½æ•°å—代表å分之一¿U’,½W¬äºŒä½æ•°å—代表百分之一¿U’,½W¬ä¸‰ä½æ•°å—代表åƒåˆ†ä¹‹ä¸€¿U’。当使用12 ž®æ—¶åˆ¶æ—¶ç”¨AM。am å’ŒPMåQˆpmåQ‰åˆ†åˆ«æŒ‡å®šæ—¶é—´æ˜¯åˆå‰æˆ–åˆåŽï¼Œè‹¥ä¸æŒ‡å®šåQŒç³»¾lŸé»˜è®¤äØ“AM。AM 与PM å‡ä¸åŒºåˆ†å¤§å°å†™ã€‚如åQ?br />   3:5:7.2pm---下åˆ3 æ—? åˆ? ¿U?00 毫秒
   10:23:5.123Am---上åˆ10 æ—?3 åˆ? ¿U?23 毫秒
   å¯ä»¥ä½¿ç”¨SET DATEFORMAT 命ä×oæ¥è®¾å®šç³»¾lŸé»˜è®¤çš„æ—¥æœŸ-æ—‰™—´æ ¼å¼ã€?
4.3.8 è´§å¸æ•°æ®¾cÕdž‹
è´§å¸æ•°æ®¾cÕdž‹ç”¨äºŽå˜å‚¨è´§å¸å€¹{€‚åœ¨ä½¿ç”¨è´§å¸æ•°æ®¾cÕdž‹æ—Óž¼Œåº”在数æ®å‰åŠ ä¸Šè´§å¸ç¬¦åøP¼Œ¾pÈ»Ÿæ‰èƒ½è¾¨è¯†å…¶äؓ哪国的货å¸ï¼Œå¦‚æžœä¸åŠ è´§å¸½W¦å·åQŒåˆ™é»˜è®¤ä¸ºâ€œïòEâ€ã€‚å„货帽W¦å·å¦‚图4-2所½Cºã€?br />   1 MONEY
MONEY 数殾cÕdž‹çš„æ•°æ®æ˜¯ä¸€ä¸ªæœ‰4 ä½å°æ•°çš„DECIMAL å€û|¼Œå…¶å–å€ég»Ž-2çš?3‹Æ¡æ–¹åQ?922åQ?37åQ?03åQ?85åQ?77.5808åˆ?çš?3‹Æ¡æ–¹-1åQ?922åQ?37åQ?03åQ?85åQ?77.5807åQ‰ï¼Œæ•°æ®¾_‘Öº¦ä¸ÞZ¸‡åˆ†ä¹‹ä¸€è´§å¸å•ä½ã€‚MONEY 数殾cÕdž‹ä½¿ç”¨8个å—节å˜å‚¨ã€?br />Â
   2 SMALLMONEY
SMALLMONEY数殾cÕdž‹¾cÖM¼¼äºŽMONEY ¾cÕdž‹åQŒä½†å…¶å˜å‚¨çš„è´§å¸å€ÆDŒƒå›´æ¯”MONEY数殾cÕdž‹ž®?å…¶å–å€ég»Ž-214,748.3648åˆ?214,748.3647,å˜å‚¨½Iºé—´ä¸? 个å—节ã€?/p>
4.3.9 特定数殾cÕdž‹
SQL Server ä¸åŒ…å«äº†ä¸€äº›ç”¨äºŽæ•°æ®å˜å‚¨çš„ç‰Òޮп•°æ®¾cÕdž‹ã€?br />   1 TIMESTAMP
TIMESTAMP数殾cÕdž‹æä¾›æ•°æ®åº“范围内的惟一值椾cÕdž‹ç›¸å½“于BINARY8或VARBINARYåQ?åQ‰ï¼Œä½†å½“它所定义的列在更新或æ’入数æ®è¡Œæ—¶åQŒæ¤åˆ—çš„å€ég¼šè¢«è‡ªåŠ¨æ›´æ–ŽÍ¼Œä¸€ä¸ªè®¡æ•°å€¼å°†è‡ªåŠ¨åœ°æ·»åŠ åˆ°æ¤TIMESTAMPæ•°æ®åˆ—ä¸ã€‚æ¯ä¸ªæ•°æ®åº“表ä¸åªèƒ½æœ‰ä¸€ä¸ªTIMESTAMPæ•°æ®åˆ—。如果å¾ç«‹ä¸€ä¸ªå为“TIMESTAMPâ€çš„列,则该列的¾cÕdž‹ž®†è¢«è‡ªåŠ¨è®¾äØ“TIMESTAMP数殾cÕdž‹ã€?/p>
   2 UNIQUEIDENTIFIER
UNIQUEIDENTIFIER 数殾cÕdž‹å˜å‚¨ä¸€ä¸?6 ä½çš„二进制数å—ã€‚æ¤æ•°å—¿UîCØ“åQˆGUIDGlobally Unique Identifier åQŒå³å…¨çƒæƒŸä¸€é‰´åˆ«åøP¼‰ã€‚æ¤æ•°å—ç”±SQLServer çš„NEWIDå‡½æ•°äº§ç”Ÿçš„å…¨çƒæƒŸä¸€çš„ç¼–ç ,在全çƒå„地的计算机ç»ç”±æ¤å‡½æ•°äº§ç”Ÿçš„æ•°å—ä¸ä¼šç›¸åŒã€?/p>
4.3.10 用户自定义数æ®ç±»åž?br />SYSNAME SYSNAME 数殾cÕdž‹æ˜¯ç³»¾lŸæä¾›ç»™ç”¨æˆ·çš„,便于用户自定义数æ®ç±»åž‹ã€‚å®ƒè¢«å®šä¹‰äØ“NVARCHARåQ?28åQ‰ï¼Œå›_®ƒå¯å˜å‚?28个UNICODEå—符æˆ?56个一般嗽W¦ã€‚其具体使用æ–ÒŽ³•请å‚è§ç¬¬7ç« â€œç®¡ç†æ•°æ®åº“表â€ä¸çš„“自定义数殾cÕdž‹â€ç« 节ã€?/p>
4.3.11 æ–°æ•°æ®ç±»åž?br />SQL Server 2000 ä¸å¢žåŠ äº†3 ¿Uæ•°æ®ç±»åž‹ï¼šBIGINTã€SQL_VARIANTå’ŒTABLE。其ä¸BIGINT数殾cÕdž‹å·²åœ¨æ•´æ•°¾cÕdž‹ä¸ä»‹¾l,下é¢ä»‹ç»å…¶ä½™ä¸¤ç§åQ?br />   1 SQL_VARIANT
SQL_VARIANT数殾cÕdž‹å¯ä»¥å˜å‚¨é™¤æ–‡æœ¬ã€å›¾å½¢æ•°æ®ï¼ˆTEXTã€NTEXTã€IMAGEåQ‰å’ŒTIMESTAMP¾cÕdž‹æ•°æ®å¤–的其它ä»ÖM½•åˆæ³•çš„SQL Serveræ•°æ®ã€‚æ¤æ•°æ®¾cÕdž‹å¤§å¤§æ–¹ä¾¿äº†SQL Server的开å‘工作ã€?br />   2 TABLE
TABLE 数殾cÕdž‹ç”¨äºŽå˜å‚¨å¯¹è¡¨æˆ–视囑֤„ç†åŽçš„结果集。这一新类型ä‹Éå¾—å˜é‡å¯ä»¥å˜å‚¨ä¸€ä¸ªè¡¨åQŒä»Žè€Œä‹É函数或过½E‹è¿”å›žæŸ¥è¯¢ç»“æžœæ›´åŠ æ–¹ä¾¿å¿«ã€æ·å…¶ã€ä‹É用请å‚è§½W?3ç« â€œæ¸¸æ ‡ã€è§†å›‘Ö’Œè‡ªå®šä¹‰å‡½æ•°â€ã€?/p>
Â