1 普通sql語句可以用exec執行,如:
SELECT * FROM video EXEC ('SELECT * FROM video') EXEC sp_executesql N'SELECT * FROM video' --字符串前一定要加N
2 字段名,表名,數據庫名之類作為變量時,必須用動態sql
DECLARE @fname NVARCHAR(20) SET @fname = 'Name' SELECT @fname FROM Video --以上結果為Name,並非所要
可以使用這樣動態拼接:
EXEC(' select ' + @fname + ' from video')--注意加號前后的單引號都加上空格
--當然將字符串形式改成變量也可以 DECLARE @sql NVARCHAR(MAX) DECLARE @fname NVARCHAR(20) SET @fname = '[SeoFilename]' set @sql = 'SELECT ' + @fname + ' FROM Video AS v' EXEC (@sql)--一定要記得這個小括號 ,這里的@sql是varchar類型可以
注意:也可以使用 exec sp_executesql 形式
EXEC sp_executesql @sql -- 注意:@sql必須是ntext,nchar,nvarchar類型,不可以是varchar類型
3 輸入或者輸出參數
動態查詢語句變量:必須為ntext,nchar,nvarchar類型
設置動態語句中的查詢字符串,必須為ntext,nchar,nvarchar類型
declare @input_id int--定義需傳入動態語句的參數的值,參數1 declare @input_name varchar(20)--定義需傳入動態語句的參數的值,參數2 DECLARE @QueryString NVARCHAR(MAX)--動態語句變量 DECLARE @paramstring NVARCHAR(200)--設置動態語句中的動態字符串參數 -- -- set @QueryString='select * from Video where id=@id and SeoFilename=@name' --id與name為字段名,@id與@name為要傳入的參數 set @paramstring='@id int,@name varchar(20)' --設置動態語句中參數的定義的字符串,多個參數用" -- set @input_id =2 --設置需傳入動態語句的參數的值為1 set @input_name='新增視頻一' --設置需傳入動態語句的參數的值為"張三" exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name --請注意參數的順序
4 輸出參數
DECLARE @num INT,@sql NVARCHAR(MAX) SET @sql = 'select count(1) from Video' EXEC(@sql)
如何將總數的結果返回給一個變量呢?
DECLARE @QueryString NVARCHAR(MAX) DECLARE @ParamString NVARCHAR(200) DECLARE @output_result INT --查詢結果返回給它 SET @QueryString = ' select @totalcount = count(1) from video '--定義@totalcount為輸出結果參數 SET @ParamString = ' @totalcount int output ' EXEC sp_executesql @QueryString,@ParamString,@totalcount = @output_result OUTPUT SELECT @output_result AS '返回總數'
另外,動態語句查詢的結果集要輸出的話,可以使用臨時表的方法
先判斷臨時表是否存在
IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判斷臨時表#tmp是否存在,存在則刪除 drop table #tmp
IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判斷臨時表#tmp是否存在,存在則刪除
drop table #tmp
SELECT * INTO #tmp FROM Video AS v
SELECT * FROM #tmp AS t
sqlserver數據庫中用到的Identity列
當表中被刪除了某些數據,自增長的編號就不再是一個連線的數據
可以使用 SET IDENTITY_INSERT Video ON
允許將顯式值插入到表的標示列中,當設置為on,這時可能在insert 操作時候手動指定插入到標示列中的序號,,同時必須在完成操作后,將IDENTITY_INSERT 還原成off
否則,下次插入的時候必須指定編號,不然就無法完成Insert操作
當表中的記錄被全部刪除,但此時標示列的值很大很大,如果不重置,會無休止的增長,這個時候可以用:DBCC CHECKIDENT(Video, [RESEED|NORESEED], [1]) 進行重置
--重置表中標識列中種子值 DBCC CHECKIDENT(Video, [RESEED|NORESEED], [1]) --獲取當前表中標示列的種子值 DBCC CHECKIDENT(Video,NORESEED)