SQL SERVER 中構建執行動態SQL語句

iSQlServer發表於2010-01-12

1 :普通SQL語句可以用exec執行

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtSelect * from tableName 
exec('select * from tableName'
exec sp_executesql N'select * from tableName' -- 請注意字串前一定要加N 

 

 

2:欄位名,表名,資料庫名之類作為變數時,必須用動態SQL

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtdeclare @fname varchar(20
set @fname = 'FiledName' 
--Select @fname from tableName -- 錯誤,不會提示錯誤,但結果為固定值FiledName,並非所要。 
exec('select ' + @fname + ' from tableName'-- 請注意 加號前後的 單引號的邊上加空格 

--當然將字串改成變數的形式也可 
declare @fname varchar(20
set @fname = 'FiledName' --設定欄位名 

declare @s varchar(1000
set @s = 'select ' + @fname + ' from tableName' 
exec(@s-- 成功 
--
exec sp_executesql @s -- 此句會報錯 

declare @s Nvarchar(1000-- 注意此處改為nvarchar(1000) (必須為ntext或nchar哐nvarchar型別,不能是varchar型別)

set @s = 'select ' + @fname + ' from tableName' 
exec(@s-- 成功 
exec sp_executesql @s -- 此句正確 


 

3. 輸入或輸出引數

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt--(1)輸入引數:
          declare @QueryString nvarchar(1000--動態查詢語句變數(注:必須為ntext或nchar哐nvarchar型別,不能是varchar型別)
          declare @paramstring nvarchar(200--設定動態語句中的引數的字串(注:必須為ntext或nchar哐nvarchar型別,不能是varchar型別)
          declare @input_id int--定義需傳入動態語句的引數的值

          
set @QueryString='select * from tablename  where id=@id'  --id為欄位名,@id為要傳入的引數
          set @paramstring='@id int' --設定動態語句中引數的定義的字串
          set @input_id =1  --設定需傳入動態語句的引數的值為1
          exec sp_executesql @querystring,@paramstring,@id=@input_id  
          
--若有多個引數:
          declare @QueryString nvarchar(1000--動態查詢語句變數(注:必須為ntext或nchar哐nvarchar型別,不能是varchar型別)
          declare @paramstring nvarchar(200--設定動態語句中的引數的字串(注:必須為ntext或nchar哐nvarchar型別,不能是varchar型別)
          declare @input_id int--定義需傳入動態語句的引數的值,引數1
          declare @input_name varchar(20)--定義需傳入動態語句的引數的值,引數2

          
set @QueryString='select * from tablename  where id=@id and name=@name'   --id與name為欄位名,@id與@name為要傳入的引數
          set @paramstring='@id int,@name varchar(20)' --設定動態語句中引數的定義的字串,多個引數用","隔開
          set @input_id =1  --設定需傳入動態語句的引數的值為1
          set @input_name='張三'   --設定需傳入動態語句的引數的值為"張三"
          exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name --請注意引數的順序
     --(2)輸出引數
             declare @num int@sqls nvarchar(4000
            
set @sqls='select count(*) from tableName' 
            
exec(@sqls
        
--如何將exec執行結果放入變數中?          
        declare @QueryString nvarchar(1000--動態查詢語名變數(注:必須為ntext或nchar哐nvarchar型別,不能是varchar型別)
        declare @paramstring nvarchar(200--設定動態語句中的引數的字串(注:必須為ntext或nchar哐nvarchar型別,不能是varchar型別)
        declare @output_result int--查詢結果賦給@output_result 

        
set @QueryString='select @totalcount=count(*) from tablename' --@totalcount 為輸出結果引數
        set @paramstring='@totalcount int output' --設定動態語句中引數的定義的字串,多個引數用","隔開
        exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output
        
select @output_result
        
--當然,輸入與輸出引數可以一起使用,大家可以自己去試一試。
        --另外,動態語句查詢的結果集要輸出的話,我只想到以下用臨時表的方法,不知各位有沒有更好的方法.
        IF object_id('[tempdb].[dbo].#tmp'IS NOT NULL --判斷臨時表#tmp是否存在,存在則刪除
            drop table #tmp
        
select * into #tmp from tablename where 1=2 --建立臨時表#tmp,其結構與tablename相同

        
declare @QueryString nvarchar(1000--動態查詢語名變數(注:必須為ntext或nchar哐nvarchar型別,不能是varchar型別)
        set @QueryString='select * from tablename '
        
insert into #tmp(field1,field2,exec(@querystirng

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-624900/,如需轉載,請註明出處,否則將追究法律責任。

相關文章