動態sql語句基本語法


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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM