濮阳杆衣贸易有限公司

主頁 > 知識庫 > SQL SERVER 中構(gòu)建執(zhí)行動態(tài)SQL語句的方法

SQL SERVER 中構(gòu)建執(zhí)行動態(tài)SQL語句的方法

熱門標(biāo)簽:奧威地圖標(biāo)注多個(gè)地方 武漢長沙外呼系統(tǒng)方法和技巧 百度地圖標(biāo)注不同路線 千呼電銷機(jī)器人價(jià)格 京華物流公司地圖標(biāo)注 智能語音外呼系統(tǒng)選哪家 怎樣在地圖上標(biāo)注路線圖標(biāo) 優(yōu)質(zhì)地圖標(biāo)注 外呼系統(tǒng)電銷專用

1 :普通SQL語句可以用exec執(zhí)行

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

2:字段名,表名,數(shù)據(jù)庫名之類作為變量時(shí),必須用動態(tài)SQL

declare @fname varchar(20) 
set @fname = 'FiledName' 
--Select @fname from tableName -- 錯(cuò)誤,不會提示錯(cuò)誤,但結(jié)果為固定值FiledName,并非所要。 
exec('select ' + @fname + ' from tableName') -- 請注意 加號前后的 單引號的邊上加空格 

--當(dāng)然將字符串改成變量的形式也可 
declare @fname varchar(20) 
set @fname = 'FiledName' --設(shè)置字段名 

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

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

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

3. 輸入或輸出參數(shù)

--(1)輸入?yún)?shù):
     declare @QueryString nvarchar(1000) --動態(tài)查詢語句變量(注:必須為ntext或nchar哐nvarchar類型,不能是varchar類型)
     declare @paramstring nvarchar(200) --設(shè)置動態(tài)語句中的參數(shù)的字符串(注:必須為ntext或nchar哐nvarchar類型,不能是varchar類型)
     declare @input_id int--定義需傳入動態(tài)語句的參數(shù)的值

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

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

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

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

有些特殊原因,我們需要在SQL語句或者存儲過程中動態(tài)創(chuàng)建SQL語句,然后在SQL語句或存儲過程中動態(tài)來執(zhí)行。

這里,微軟提供了兩個(gè)方法,一個(gè)是使用

Execute函數(shù)

執(zhí)行方式為

Execute(@sql)來動態(tài)執(zhí)行一個(gè)SQL語句,但是這里的SQL語句無法得到里面的返回結(jié)果,下面來介紹另一種方法

使用存儲過程 sp_ExecuteSql

使用該存儲過程,則可將動態(tài)語句中的參數(shù)返回來。

比如

declare @sql nvarchar(800),@dd varchar(20)
set @sql='set @mm=''測試字符串'''
exec sp_executesql @sql,N'@mm varchar(20) output',@dd output
select @dd 

執(zhí)行他就會將內(nèi)部創(chuàng)建的SQL語句的某個(gè)變量的值返回到外部調(diào)用者。

主要來源于工作中的一個(gè)偶然需要:

create proc proc_InToServer @收費(fèi)站點(diǎn)編號 varchar(4),@車道號 tinyint,@進(jìn)入時(shí)間 varchar(23),@UID char(16),
@車牌 varchar(12),@車型 char(1),@識別車牌號 varchar(12),@識別車型 char(1),@收費(fèi)金額 money,@交易狀態(tài) char(1),
@有圖像 bit,@離開時(shí)間 varchar(23),@速度 float,@HasInsert int output
as
begin
  declare @inTime datetime,@TableName varchar(255),@leaveTime datetime,@HasTable bit,@Sql nvarchar(4000)
 select @intime=Convert(datetime,@進(jìn)入時(shí)間),@leaveTime=Convert(datetime,@離開時(shí)間)
 set @TableName='ETC03_01_OBE原始過車記錄表_'+dbo.formatDatetime(@intime,'YYYYMMDD')

 select @HasTable=(Case when Count(*)>0 then 1 else 0 end) from sysobjects where id=Object_id(@TableName) and ObjectProperty(id,'IsUserTable')=1
 if @HasTable=0
 begin
  set @Sql='CREATE TABLE [dbo].['+@TableName+'] (
 [收費(fèi)站點(diǎn)編號] [char] (4) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [車道號] [tinyint] NOT NULL,
 [進(jìn)入時(shí)間] [datetime] NOT NULL,
 [UID] [char] (16) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [車牌] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
 [車型] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
 [識別車牌號] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
 [識別車型] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
 [收費(fèi)金額] [money] NULL ,
 [交易狀態(tài)] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
 [有圖像] [bit] NOT NULL ,
 [離開時(shí)間] [datetime] NULL ,
 [速度] [float] NULL,
    Constraint'+' PK_'+@TableName+' primary key(收費(fèi)站點(diǎn)編號,車道號,進(jìn)入時(shí)間,UID)
    ) ON [PRIMARY]'
   Execute(@Sql)
  end 
  set @sql = 'select @Cnt=count(*) from '+@TableName+ ' where 收費(fèi)站點(diǎn)編號='''+@收費(fèi)站點(diǎn)編號+''' and 車道號='+cast(@車道號 as varchar(4))+' and 進(jìn)入時(shí)間='''+@進(jìn)入時(shí)間+''' and UID='''+@UID+''''
  set @sql = @sql + ' if @Cnt=0 '
  
  set @sql=@sql+'insert '+@TableName+' values('''+@收費(fèi)站點(diǎn)編號+''','+cast(@車道號 as varchar(4))+','''+@進(jìn)入時(shí)間+''','''+@Uid+''','''+@車牌+  
  ''','''+@車型+''','''+  @識別車牌號+''','''+@識別車型+''','+Cast(@收費(fèi)金額 as varchar(8))+','''+@交易狀態(tài)+''','+cast(@有圖像 as varchar(1))+
  ','''+@離開時(shí)間+''','+Cast(@速度 as varchar(8))+')'
  --Execute(@sql) 
  exec sp_executesql @sql,N'@Cnt int output',@HasInsert output
end

這樣大家基本上就有些了解了。

您可能感興趣的文章:
  • PHP實(shí)現(xiàn)mysqli批量執(zhí)行多條語句的方法示例
  • 用非動態(tài)SQL Server SQL語句來對動態(tài)查詢進(jìn)行執(zhí)行
  • mybatis 插件: 打印 sql 及其執(zhí)行時(shí)間實(shí)現(xiàn)方法
  • Mysql使用kill命令解決死鎖問題(殺死某條正在執(zhí)行的sql語句)
  • Mysql 服務(wù) 1067 錯(cuò)誤 的解決方法:修改mysql可執(zhí)行文件路徑
  • MySql批量插入優(yōu)化Sql執(zhí)行效率實(shí)例詳解
  • oracle查看執(zhí)行最慢與查詢次數(shù)最多的sql語句
  • SQL執(zhí)行步驟的具體分析

標(biāo)簽:威海 七臺河 益陽 銅仁 天水 防疫戰(zhàn)設(shè) 宿州 來賓

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL SERVER 中構(gòu)建執(zhí)行動態(tài)SQL語句的方法》,本文關(guān)鍵詞  SQL,SERVER,中,構(gòu)建,執(zhí)行,動態(tài),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL SERVER 中構(gòu)建執(zhí)行動態(tài)SQL語句的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于SQL SERVER 中構(gòu)建執(zhí)行動態(tài)SQL語句的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    七台河市| 涞水县| 潜山县| 榆中县| 咸阳市| 定日县| 民乐县| 定结县| 雷州市| 福建省| 响水县| 四平市| 丰原市| 肥乡县| 安龙县| 偃师市| 贵定县| 延寿县| 大新县| 卢龙县| 无棣县| 保靖县| 滁州市| 华安县| 当阳市| 南雄市| 巧家县| 扶风县| 北海市| 海阳市| 鄂州市| 池州市| 原阳县| 烟台市| 承德县| 巨野县| 镇沅| 汉沽区| 平果县| 贺州市| 敦煌市|