ADO技術(shù)ADO連接數(shù)據(jù)庫(kù)1) 獲取連接字符串 方式一: 記住連接字符串 connectionString=" Integrated Security=True; server=. ; database=DBName" 方式二:在visual studio中,點(diǎn)擊”視圖”à服務(wù)資源管理器à右擊左側(cè)的”數(shù)據(jù)連接”,選擇” 添加連接”à服務(wù)名: 為一個(gè)點(diǎn).選擇數(shù)據(jù)庫(kù)名,然后點(diǎn)擊”高級(jí)”,然后復(fù)制底部的連接字符串 2) 在web.config中配置連接字符串 <connectionStrings> <addname="SQLconnectionStr"connectionString="Data Source=.;Initial Catalog=NetShopDB;Integrated Security=True"providerName="System.Data.SqlClient"/> </connectionStrings>
3) 在DAL層新建SqlConnection類(lèi),包含靜態(tài)方法: 記得先添加Configuration引用和 using System.Configuration;命名空間 public static string getConnectionStr() { return ConfigurationManager.ConnectionStrings["SQLconnectionStr"].ToString(); } 4) 在DAL層其他類(lèi)中調(diào)用getConnectionStr()靜態(tài)方法 string conStr= SqlConnection.getConnectionStr();
DAL層執(zhí)行SQL語(yǔ)句的方法ADO操作SQL語(yǔ)句:方式一 public List<student> getData1(string myid, string myname) { //這里用using靈活方便,用完con不需手動(dòng)關(guān)閉,會(huì)自動(dòng)關(guān)閉當(dāng)前連接 using(SqlConnection con=new SqlConnection(conStr) ) { //打開(kāi)連接 con.Open(); string cmdStr = "select * from ns_user where userID=@myid and userName=@myname"; SqlCommand cmd = new SqlCommand(cmdStr,con); //這里用參數(shù)序列化防止注入式攻擊 cmd.Parameters.Add(new SqlParameter("@myid", myid)); cmd.Parameters.Add(new SqlParameter("@myname", myname)); //執(zhí)行查詢(xún),并返回查詢(xún)所返回的結(jié)果集中第一行的第一列。忽略其他列或行 //object myResult = cmd.ExecuteScalar(); // 對(duì)連接執(zhí)行 Transact-SQL 語(yǔ)句并返回受影響的行數(shù)。(負(fù)責(zé)執(zhí)行語(yǔ)句, 例如增insert,刪delete,改update) //int ResultRowCount = cmd.ExecuteNonQuery(); SqlDataReader sdr = cmd.ExecuteReader(); List<student> ls = new List<student>(); while (sdr.Read()) { student s = new student(); s.Sid = sdr["sid"].ToString(); s.Sname = sdr["sname"].ToString(); ls.Add(s); } return ls; } } Dataset(記得)#region 獲取教師的詳細(xì)信息 public DataSet GetTeacherInfo() { using (SqlConnection conn = new SqlConnection(dbapp)) { SqlDataAdapter sda = new SqlDataAdapter("select * from table1 ", conn); DataSet ds = new DataSet(); //定義一個(gè)表的集合 sda.Fill(ds, "teacher"); return ds; }
} #endregion
ADO操作存儲(chǔ)過(guò)程: #region public int UserCheck(string userID,string userName) { using(SqlConnection con=new SqlConnection (conStr)) { con.Open(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = "sp_MYLogin"; //sp_MYLogin是存儲(chǔ)過(guò)程名稱(chēng) cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = con;
//為存儲(chǔ)過(guò)程賦值 //賦值方式一(賦第一個(gè)值括號(hào)里面的 "@name"必須和存儲(chǔ)過(guò)程里的"@name"一模一樣) cmd.Parameters.Add(new SqlParameter("@userID", userID));
//賦值方式二(賦第二個(gè)值) SqlParameter pwd = new SqlParameter("@pwd", SqlDbType.NVarChar, 50); pwd.Value = userName; pwd.Direction = ParameterDirection.Input; cmd.Parameters.Add(pwd); //定義一個(gè)變量來(lái)接受存儲(chǔ)過(guò)程的返回值 SqlParameter result = new SqlParameter("@return", SqlDbType.Int); result.Direction = ParameterDirection.ReturnValue; cmd.Parameters.Add(result);
cmd.ExecuteNonQuery(); //執(zhí)行存儲(chǔ)過(guò)程
//取得SQL變量@result中存放的存儲(chǔ)過(guò)程的返回值 int num = Convert.ToInt32(cmd.Parameters["@return"].Value); //Parameters是一個(gè)集合["@return"]就是他的索引 return num; } } #endregion 錯(cuò)誤日志catch (Exception ex) { //錯(cuò)誤日志 error.ErrorWrite("UserInsert", ex.Message, DateTime.Now.ToString()); return null; }
數(shù)據(jù)庫(kù)技術(shù)建修庫(kù)表建庫(kù)語(yǔ)句 create database student --創(chuàng)建的數(shù)據(jù)庫(kù)名稱(chēng) on primary ---指定數(shù)據(jù)文件的各個(gè)參數(shù) ( name='studnet3_data', --所有的字符串都以' 間隔 filename='E:\lx\student4_data.mdf', --文件名包含路徑和名字.擴(kuò)展名 size=3MB, ----默認(rèn)大小,如果不寫(xiě)大小,則默認(rèn)是MB maxsize=100MB, ----最大容量 filegrowth=1MB ---自動(dòng)增長(zhǎng)量/擴(kuò)容,如果為,則不自動(dòng)擴(kuò)容 )
log on -----日志文件的各個(gè)參數(shù) ( name='student5_log', filename='E:\lx\student4_data.ldf', size=1MB, maxsize=10MB, filegrowth=10% --10%是最大容量的%) )
sp_helpdb student ---查詢(xún)數(shù)據(jù)庫(kù)名稱(chēng) sp_renamedb student,stu --重命名數(shù)據(jù)庫(kù) drop database student --刪除數(shù)據(jù)庫(kù)
建表語(yǔ)句
drop table person --刪除表 create table person --創(chuàng)建表 ( ---注意:下面是屬性(字段名稱(chēng))在前,數(shù)據(jù)類(lèi)型在后 ID int primary key identity(2,1) not null, -- primary key是設(shè)置主鍵,保證該列值唯一且不為空,identity(2,1)起始值是,步長(zhǎng)為 Name nvarchar(10) not null, ---not null是指不能為空 Sex bit not null, --bit是bool類(lèi)型 age int default 18 , -- default 18是指自動(dòng)取默認(rèn)值 scroe decimal(4,1) check(score<=100) --4指小數(shù)點(diǎn)前后加起來(lái)總共位,代表小數(shù)點(diǎn)后位數(shù) check是檢查限制約束 cardid int unique --unique 指唯一鍵,在表中有多列數(shù)據(jù)需要保證唯一時(shí)除了主鍵以外的列需要設(shè)置為唯一列 )
對(duì)表的操作修改表結(jié)構(gòu),添加刪除約束 alter table person --修改表結(jié)構(gòu) --add NameID int --添加屬性\字段NameID列,添加列 --drop column NameID --刪除列
--alter column ID int not null ---添加字段不為空 --add constraint 約束名(pk_表名_列名| pk_列名) --add constraint pk_ID primary key(ID) --修改表時(shí)添加主鍵約束 --add constraint ck_score check(score<150) --修改表時(shí)添加檢查約束 --add constraint uk_cardi unique(cardid) --修改表時(shí)添加唯一鍵約束 --add constraint df_age default 19 for age --修改表時(shí)添加默認(rèn)約束 --drop constraint CK__person__score__15502E78 --刪除約束(格式:drop constraint 約束名) 修改表信息,增(insert) 刪(delete) 改(update) 查(select) --添加記錄<insert 表名values(參數(shù))> <1>字符串或日期類(lèi)型加'' <2>bit用或 <2>自動(dòng)增長(zhǎng)列不需要添加值 insert person values(12,'wang',0,23,32,34) insert person(sex,age,cardid) values(0,23,32) --有選擇性的插入數(shù)據(jù)((sex,age,cardid) )指要手動(dòng)添加的數(shù)據(jù)
--修改記錄 <update 表名set 修改對(duì)象where 條件> <1>修改多個(gè)字段,中間以逗號(hào)間隔 update person set age=19,sex=0 where ID=1 update person set age=19,age=12 where ID=2 ---<1> update person set age=19+1 where ID=2 ---修改信息時(shí)進(jìn)行算術(shù)運(yùn)算 update person set age=19+1 --如果不寫(xiě)where,則對(duì)所有數(shù)據(jù)進(jìn)行修改
update person set age=SUBSTRING(age,1,1) where ID=1 --substring 是字符的截取
--刪除記錄< delete 表名where 條件> (如果不加where則刪除所有記錄) delete person where ID=1
對(duì)表的查詢(xún)單表查詢(xún) select * from tableName --查找顯示整個(gè)表(所有列) select列名1,列名2 from tableName --顯示部分列 select列名1='編號(hào)',列名2='品牌' from Product1 --把其中一列的信息統(tǒng)一修改
--修改顯示時(shí)列標(biāo)題(方法一) select '編號(hào)'=ProCode,'品牌'=ProTypeName from Product1 --修改顯示時(shí)列標(biāo)題(方法二) Select 列名1 '編號(hào)',列名2 '品牌' from Product1
--顯示時(shí)對(duì)列進(jìn)行算數(shù)運(yùn)算, 顯示時(shí)添加列 select列名1,列名2,列名3*0.5 '打折后',Number from Product1
select distinct 列名1 from tableName --顯示時(shí)刪除該列的重復(fù)行 select top 3 * from Product1 --顯示前三列 select top 50 percent * from Product1 --顯示總行數(shù)的前%行 --and是并且, or是或者 , 條件非: not 列名=’值’ select * from tableName where Number=15 and not age=12 and Name='aa' or sex=1 --查找score范圍為0到100的數(shù)據(jù) select * from Product1 where score<100 and score >=1 select * from Product1 where score between 1 and 100 --in,not in (包含不包含) 以下都是查找number為,,的數(shù)據(jù) select * from Product1 where Number=10 or Number=15 or Number=20 select * from Product1 where Number in(10,15,20) select * from Product1 where not Number in(10,15,20) --<1>like模式匹配符%可以代替任意個(gè)數(shù)量的字符<2> _可以代替一個(gè)字符 <3>[]是一個(gè)查找范圍 select * from Product1 where ProCode like 'D%' --查找首字母為D的ProCode的數(shù)據(jù) select * from Product1 where ProCode like '_S%' --查找第二個(gè)字符是S的procode數(shù)據(jù) select * from Product1 where 列名1 like '1%' --即使是float型也要加'' select * from Product1 where 列名1 like '_4_' --查找第二個(gè)字符是且字符個(gè)數(shù)為的3數(shù)據(jù) select * from Product1 where 列名1 like '_[5-9]%' --查找第二個(gè)字符是5到9的列名1數(shù)據(jù) --查找為空,不為空的數(shù)據(jù) select *from Product1 where proValue is not null select *from Product1 where proValue is null go --排序( desc降序 asc升序 什么都不寫(xiě)就默認(rèn)升序 ) select * from Product1 order by proValue desc --將provalue按降序排列 select * from Product1 order by proValue asc --將provalue按升序排列 select * from Product1 order by Number --將Number按默認(rèn)(升序)排列 select * from Product1 order by Number desc,proValue asc --第二個(gè)條件在第一個(gè)條件相同時(shí)才執(zhí)行 go --聚合函數(shù) select MAX(proValue) from Product1 --查找proValue中的最大值 select min(proValue) from Product1 --查找proValue中的最小值 select sum(proValue) from Product1 --查找proValue中數(shù)據(jù)的和 select avg(proValue) from Product1 --查找proValue中的平均值 select count(*) from Product1 --查找表中的行數(shù)*也可以用列名代替
--group by分組(where在group by 之前,having分組之后的篩選條件,where和having都是篩選條件) --分組:可以顯示分組列的信息和分組后的信息分別進(jìn)行統(tǒng)計(jì) select列名1,max(列名2),min(列名3) from tableName where proTypeName='電視機(jī)' group by 列名1 select proTypeName,max(proValue),min(proValue) from Product1 group by proTypeName having count(proValue)>1
多表查詢(xún)
--內(nèi)連接inner join 查詢(xún)兩表共有的信息 --from查詢(xún)列名1.Name=列名2.Name 是關(guān)聯(lián)條件(關(guān)聯(lián)條件中列的內(nèi)容要一致) select * from tableName inner join Product2 on列名1.Name=列名2.Name --顯示查詢(xún)后的部分列,p1.*意思是顯示p1的所有列 select p1.*,proArea,proBrand from Product1 as p1 inner join Product2 on p1.ProCode=Product2.ProCode --Product1 as p1 意思是給Product1起了個(gè)別名p1 ,as 可以省略 select * from Product1 as p1 inner join Product2 as p2 on p1.ProCode=p2.ProCode --where查詢(xún),省略了as <格式:select * from 表,表where 關(guān)聯(lián)條件> select * from Product1 p1,Product2 p2 where p1.ProCode=p2.ProCode
--外連接 --先顯示兩表關(guān)聯(lián)到的數(shù)據(jù),再顯示關(guān)聯(lián)不到的數(shù)據(jù) go --<格式:select * from 表left\right\full outer join 表on 關(guān)聯(lián)條件> select * from Product1 p1 left outer join Product2 p2 on p1.ProCode=p2.ProCode --左外連接 select * from Product1 p1 right outer join Product2 p2 on p1.ProCode=p2.ProCode --右外連接 select * from Product1 p1 full outer join Product2 p2 on p1.ProCode=p2.ProCode --全外連接
--交叉連接(又叫笛卡爾連接:瘋狂連接,n對(duì)n連接,沒(méi)有關(guān)聯(lián)條件) --格式:select * from 表cross join 表 select * from Product1 cross join Product2 --自連接(自查詢(xún):是把一張表分解成兩張表來(lái)用) select c1.*,c2.Name from ST_class c1,ST_class c2 where c1.ID=c2.Department and c1.Name='計(jì)算機(jī)學(xué)院' --嵌套查詢(xún) --子查詢(xún)返回多個(gè)值 select * from product1 where ProCode in(select ProCode from Product2 where proArea='北京') select * from product1 where ProCode not in(select ProCode from Product2 where proArea='北京') --子查詢(xún)返回一個(gè)值 select* from Product1 where proValue=(select MAX(provalue) from Product1)
--子查詢(xún)返回多個(gè)值時(shí)可以用any(返回結(jié)果中的任何一個(gè)【最小的一個(gè)】)all(返回結(jié)果中的所有【最大值】)
--聯(lián)合查詢(xún) union all (用union all連接兩個(gè)單獨(dú)的子查詢(xún)) select SNAME,SSEX,SBIRTHDAY from STUDENT union all select TNAME,TSEX,TBIRTHDAY from TEACHER
存儲(chǔ)過(guò)程
--創(chuàng)建(create)/修改(alter)一個(gè)存儲(chǔ)過(guò)程 alter proc sp_SMGetCity ---sp_SMGetCity 是存儲(chǔ)過(guò)程的名字 ( @code nvarchar(50), --數(shù)據(jù)類(lèi)型要和比較的字符相同 @name nvarchar(50) output , @grade int=1 --'這里要注意:存儲(chǔ)過(guò)程賦初值,只能在排在最后的參量中' ---一個(gè)@ 符號(hào)是局部變量 ---兩個(gè)@ 符號(hào)是全局變量 ) as begin select @name=Name from TBName where Code like @code+'%' and Grade=@grade --begin和end 中間是要執(zhí)行的SQL語(yǔ)句 print @name --帶輸出參數(shù) end
declare @outname nvarchar(50) -- 定義一個(gè)變量 exec sp_SMGetCity'11',@outname output --@aa把變量賦值給輸出參數(shù),用來(lái)接收返回值 select @outname
sp_help sp_SMGetCity --查看名為sp_studentmanager的存儲(chǔ)過(guò)程的創(chuàng)建信息 sp_helptext sp_SMGetCity --查看名為sp_studentmanager的存儲(chǔ)過(guò)程的創(chuàng)建代碼 drop proc sp_SMGetCity --刪除存儲(chǔ)過(guò)程 ---------------------------------------------------------------------
--return只能返回整型數(shù)據(jù) --刪除存儲(chǔ)過(guò)程drop proc sp_Name -- exec(@aa)--執(zhí)行@aa(SQL語(yǔ)句),所以要加括號(hào),執(zhí)行字符串中的SQL語(yǔ)句
存儲(chǔ)過(guò)程調(diào)用存儲(chǔ)過(guò)程 as begin declare @return int exec @return=sp_checkUser@id,@name --存儲(chǔ)過(guò)程調(diào)用存儲(chǔ)過(guò)程 if @return=0 print '沒(méi)有重復(fù),return只能返回整型' else print '用戶(hù)已注冊(cè)' end
一些例子數(shù)據(jù)庫(kù)聯(lián)查授權(quán) alter view vw_Role as declare @num int declare @title nvarchar(100) declare @ctitle nvarchar(200) set @ctitle='' select @num=count(*)from dbo.Operate while(@num>0) begin select @title=name from (select row_number() over(order by id) 'newid' ,name from dbo.Operate )ta where newid =@num if(@num>1) set @ctitle+=@title+',' else set @ctitle+=@title set @num=@num-1 end Declare @sql varchar(8000) set @sql='select * from(select 1 "isture",rolename,modulename,operatename,role_ID,Module_id from vw_userrole group by rolename,modulename,operatename,role_ID,Module_id)a pivot(count(isture)for operatename in('+@ctitle+')) b' exec(@sql) ----------------------------------------------------------------
分頁(yè)器存儲(chǔ)過(guò)程,分頁(yè)存儲(chǔ)過(guò)程 alter proc cutpage ( @tablename nvarchar(100), ----分頁(yè)的表 @columnname nvarchar(100), ----分頁(yè)的列 @ordertype nvarchar(100)='asc', ----排序方式 @pageindex int =1, @pagecount int =1 ) as begin declare @aa nvarchar(max); set @aa= 'select * from (select *,ROW_NUMBER() over(order by '+@columnname+' '+@ordertype+') as uprow from '+@tablename+' ) as newtable where uprow between '+cast((@pageindex-1)*@pagecount+1 as nvarchar(100))+' and '+convert(nvarchar(100), @pageindex*@pagecount) exec (@aa) --這里@aa必須加括號(hào)()
end
exec cutpage 'SM_Class', 'classid'
事務(wù) Transaction---事務(wù)關(guān)鍵語(yǔ)句講解---- BEGIN TRANSACTION ---事務(wù)關(guān)鍵字transaction
DECLARE @errorSum INT SET @errorSum=0 --初始化為,即無(wú)錯(cuò)誤
update bank SET money=money+1000 where name='張三' SET @errorSum=@errorSum+@@error update bank SET money=money-1000 where name='李四' SET @errorSum=@errorSum+@@error --累計(jì)是否有錯(cuò)誤(@@error是非零)
if @errorSum<>0 begin print '不成功,有錯(cuò)誤,錯(cuò)誤代號(hào)是:' print @errorsum rollback transaction end else begin print '成功' select * from Bank commit TRANSACTION end
觸發(fā)器 Trigger--概念:一種特殊的存儲(chǔ)過(guò)程,將本表中的數(shù)據(jù)更改(增刪改),就會(huì)自動(dòng)執(zhí)行實(shí)現(xiàn)定義的語(yǔ)句 --特點(diǎn):跨越相關(guān)表的級(jí)聯(lián)修改 --關(guān)鍵字:trigger
alter trigger trigger_name_f on SM_Class for update --(for是在增刪改之前執(zhí)行after在增刪改之后執(zhí)行,instead of 是所有【增|刪|改】都不執(zhí)行,之前觸發(fā),但不改值) as begin if update(remark) ---判斷SM_Class表中remark列是否發(fā)生數(shù)據(jù)變化 begin select * from inserted ---存放修改的新值的表 select * from deleted ----存放修改的舊值的表 print 'remark列發(fā)生更改' end else print '其他列發(fā)生變化' print '測(cè)試觸發(fā)器,當(dāng)修改表SM_Class時(shí),顯示這句話(huà),且for時(shí)這句話(huà)在前' end
游標(biāo) Cursor--游標(biāo)類(lèi)似于sql dateReader 一行一行的讀取 --一般是在萬(wàn)不得已的情況下使用, 時(shí)間長(zhǎng),服務(wù)器壓力大,吃更多的內(nèi)存,寬帶, --游標(biāo)是對(duì)一個(gè)集合的遍歷讀取
declare cur_test cursor for select pid,pname from ns_product
open cur_test declare @id uniqueidentifier; declare @name nvarchar(50); --讀取一行(第一次讀取當(dāng)然是第一行了) fetch next from cur_test into @id,@name
--判斷一下是否讀到數(shù)據(jù)了,狀態(tài)為零說(shuō)明讀到數(shù)據(jù)了(@@FETCH_STATUS=0) while @@FETCH_STATUS=0 begin print @id print @name print '----------------------' --然后讀取下一行 fetch next from cur_test into @id,@name end close cur_test deallocate cur_test
零散知識(shí)點(diǎn)1) 截取字符串: substring(字段名, 起始位置(首位為1),截取的長(zhǎng)度 ) select SUBSTRING(age,1,1) from person where ID=2 2) 關(guān)于GUID: select NEWID() insert person values('','',NEWID()) 3) 將一張表(person2)插入到另一張表(person1)中( 列數(shù)要對(duì)應(yīng)) insert person1 select列,列,列 from person2 4) 條件語(yǔ)句 (注意: C#中的大括號(hào){}在sql中用begin end 代替 ) declare @x int ,@y int set @x=1 set @y =2 if @x>@y print 'x>y' else print 'x<y'
select code,name,grade, case Grade when '1' then '省' when '2' then '市' when '3' then '縣' end '等級(jí)' from SM_PostCode
------------------------------------------------------------- while (select MAX(DEGREE) from SCORE)<85 begin if (select MAX(DEGREE) from SCORE where CNO='3-105')>=100 break end
5) 判斷是否存在if exists( select * from TBName where CityName=’22’)
6) 添加自動(dòng)增長(zhǎng)列row_number over(order by **) ROW_NUMBER是關(guān)鍵字 over指根據(jù)哪一列排序 select ROW_NUMBER() over(order by classID) ,* from SM_Class select rank() over(order by classID) ,* from SM_Class ---也是自動(dòng)增長(zhǎng)的行號(hào),如果出現(xiàn)重復(fù)會(huì)并列行號(hào),下一個(gè)值會(huì)自動(dòng)加二
--一條查詢(xún)語(yǔ)句返回的結(jié)果作為另外一條查詢(xún)語(yǔ)句的數(shù)據(jù)源表 select * from ( select ROW_NUMBER() over(order by 列名1)此處新列名, * from TBName) 此處新表名where 新列名between 1 and 3 7) 臨時(shí)表 declare @table table(id uniqueidentifier,name varchar(50)) --執(zhí)行插入操作(插入條數(shù)據(jù)),并將這條數(shù)據(jù)的hid字段返回并插入到@table表id屬性中 insert images(Hname,Himage) output inserted.Hid into @table(id) values(@hname,@Himage) declare @picid uniqueidentifier select @picid=id from @table
------------------------------------------------------------
--下面是執(zhí)行效率的對(duì)比 --sql 語(yǔ)句一:執(zhí)行需要s declare @tempTable table(id varchar(20),name int,score datetime) insert @tempTable(id,name,score) select userID,userName,userScore from scoreTable select * from @tempTable
--sql 語(yǔ)句二:執(zhí)行只需要s DROP TABLE #Bicycles SELECT userID,userName,userScore INTO #Bicycles from scoreTable select * from #Bicycles
8) 關(guān)于日期時(shí)間的操作 --數(shù)據(jù)庫(kù)中獲取北京時(shí)間和國(guó)際時(shí)間 select getdate(), getutcdate() --時(shí)間的增加(增加的類(lèi)型[年/月/日],增量,給誰(shuí)加[當(dāng)前時(shí)間/日期])dateAdd select dateadd(YEAR,2,GETDATE()) ----將當(dāng)前的年份加上兩年
--時(shí)間的減法DateDiff select DATEDIFF(HOUR,getdate(),getutcdate()) --國(guó)際時(shí)間的小時(shí)減去當(dāng) 前北京時(shí)間的小時(shí)(后邊減前邊)
--獲取時(shí)間中的年份, 月份, 天等同理 select year(getdate())-year(birthday()) select year(getdate())-year('1988-10-07') 9) 行列轉(zhuǎn)換 select * from ( select * from TableName) a pivot(count(stuName)) for columnName in('aa','bb','cc','dd') 10) 雙引號(hào)只能用于表名和列名(不加雙引號(hào)也可以) set @aa='select ClassName "sd" from SM_Class' --注意:'' 里面原來(lái)的'sd' 現(xiàn)在要寫(xiě)成"sd" exec (@aa)
-----------------這里要多加注意------------------------------ declare @bb nvarchar(max); --在使用數(shù)據(jù)值時(shí)只能用''電商二班'' set @bb ='select * from SM_Class where ClassName=''電商二班''' --注意:原來(lái)的'電商二班'要寫(xiě)成''電商二班'' exec (@bb)
11) --快速創(chuàng)建表結(jié)構(gòu) select c.Cid,c.Ccount into newTB1 from ns_comment c where 1<>1 12) --重點(diǎn)再記一下 declare @na nvarchar(10),@str nvarchar(max); set @str=' select top 1 @bb=ClassID from SM_Class ' --@str包含SQL語(yǔ)句的變量,對(duì)@str中的變量進(jìn)行定義N標(biāo)明是字符串,用來(lái)接收@str中變量的變量(即@na=@bb) exec sp_executesql@str, N'@bb nvarchar(10) output',@na output select @na,@str 13) -------------并發(fā)問(wèn)題-------- --概念:多個(gè)用戶(hù)同時(shí)和一個(gè)對(duì)象(庫(kù),表)交互 --出現(xiàn)問(wèn)題:臟數(shù)據(jù),非重復(fù)讀取,丟失更新,幻影讀?。?/SPAN> --解決:SQL Server使用鎖來(lái)確保事務(wù)完整性(共享鎖,排它鎖,更新鎖,意向鎖,架構(gòu)鎖,批量更新鎖) 14)
|
|
來(lái)自: 昵稱(chēng)10504424 > 《SqlServer》