1. 程式人生 > >sqlserver 執行包含動態列的sql語句

sqlserver 執行包含動態列的sql語句

二樓地址http://www.cnblogs.com/wanyuan8/archive/2011/11/09/2243483.html

由於學藝不精,上述結論是受別人的啟發才得出的,相關連結:http://www.cnblogs.com/wanyuan8/archive/2011/11/09/2243483.html

下面貼出原作者博文原文(身為一名程式設計師,你懂的):

sp_executesql介紹和使用 execute相信大家都用的用熟了,簡寫為exec,除了用來執行儲存過程,一般都用來執行動態Sql
sp_executesql,sql2005中引入的新的系統儲存過程,也是用來處理動態sql的, 如:
exec sp_executesql @sql, N'@count int out,@id varchar(20)', @cou out

,@id
@sql為拼成的動態sql
N'@count int out,@id varchar(20)'為拼成的動態sql內的引數列表
@cou out,@id為為動態sql內參數列表提供值的外部引數列表

那麼它們之間有什麼區別呢?

1,它們之間最大的區別是嵌入式的引數,如下面一個語句
declare @sql nvarchar(2000)
declare @id varchar(20)
set @id='1'
set @sql='select count(*) from emp where id=' + @id
exec @sql
我想把得到的count(*)傳出來,用傳統的exec是不好辦到的,但是用sp_executesql則很容易就辦到了:

declare @sql nvarchar(2000)
declare @cou int
declare @id varchar(20)
set @id='1'
set @sql='select @count=count(*) from emp where [email protected]'
exec sp_executesql @sql, N'@count int out,@id varchar(20)', @cou out
,@id
print @cou
2.效能
可以看到,如果用exec,由於每次傳入的@id不一樣,所以每次生成的@sql就不一樣,這樣每執行一次Sql2005就必須重新將要執行的動態Sql重新編譯一次

但是sp_executesql則不一樣,由於將數值引數化,要執行的動態Sql永遠不會變化,只是傳入的引數的值在變化,那每次執行的時候就秒用重新編譯,速度自然快多了哈!

注意:
1.sp_executesql要求動態Sql和動態Sql引數列表必須是Nvarchar,比如上個例子的@sql,N'@count int out,@id varchar(20)'我記得在sql2005中Varchar也可以的,但是我打了Sp3補丁後就不行了,必須為Nvarchar
2.動態Sql的引數列表與外部提供值的引數列表順序必需一致,如:
N'@count int out,@id varchar(20)', @cou out,@id
@count 對應 @cou,@id對應@id
如果不一致,必須顯式標明,如:
N'@count int out,@id varchar(20)', @id=@id, @[email protected] out
3.動態SQl的引數列表與外部提供引數的引數列表引數名可以同名

相關推薦

sqlserver 執行包含動態sql語句

二樓地址http://www.cnblogs.com/wanyuan8/archive/2011/11/09/2243483.html 由於學藝不精,上述結論是受別人的啟發才得出的,相關連結:http://www.cnblogs.com/wanyuan8/archive

java連線資料庫和執行靜態和動態sql語句

►JDBC (Java DatabaseConnectivity) 是用於執行SQL 語句的Java 應用程式介面,由一組用Java 語言編寫的類和介面組成。 ►JDBC 是一種規範,各資料庫廠商為J

Mysql 定位執行效率低的sql 語句

optimize 用處 pen 啟用 很快 空間 復制 man pac 一、通過MySQL慢查詢日誌定位執行效率低的SQL語句。 MySQL通過慢查詢日誌定位那些執行效率較低的SQL 語句,用--log-slow-queries[=file_name]選項啟動時,mysql

mybatis中如何動態列印sql語句到控制檯

前提你已經配置好了你的Log4j的配置,否則你怎麼玩,也不可能在控制檯列印日誌的。   SpringMVC-servlet.xml <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFa

spring-data-jpa動態拼接sql語句實現動態的多表條件查詢

** spring-data-jpa 動態拼接sql語句 ** spring-data-jpa對於簡單的資料操作確實使用起來比較方便,但是對於一些比較複雜的動態的多表條件查詢就不是那麼簡單了,對於需要些sql語句並且需要動態的新增條件的時候就得使用jpa的EntityManager來

解析xml檔案動態拼接sql語句

現在有很多開源的持久層框架,比如Mybatis、BeetlSQL、Hibernate、DbUtils。當我們需要自己手寫sql的時候。使用Mybatis、BeetlSQL(這個個人更喜歡,因為結合了hibernate和mybatis各自的優點)框架相對來說更好,因為它將sql 放到配置檔案裡面。

怎麼查詢執行比較慢的sql語句

一、MySQL資料庫有幾個配置選項可以幫助我們及時捕獲低效SQL語句 1,slow_query_log 這個引數設定為ON,可以捕獲執行時間超過一定數值的SQL語句。 2,long_query_time 當SQL語句執行時間超過此數值時,就會被記錄到日誌中,建議設定為1或者更

Mybatis--如何在註解式sql中寫入動態SQL語句

突然需要用到動態SQL,應為之前我們用的是在Mapper層建立一個介面類,然後通過註解式來查詢資料庫的:如下         @Select("SELECT user_id " + " FROM sp_user_relation WHERE up_u

建立動態sql語句

舉個栗子: 資料庫有個staff表,表結構為: id name age 插入資料庫的資料: id='001' name='mike' age=20 構造一個動態變化的字典: data={ 'id':'001', 'name':'mike', 'a

執行最慢的SQL語句、總耗CPU最多的前個SQL、平均耗CPU最多的前個SQL

--執行最慢的SQL語句 SELECT (total_elapsed_time / execution_count)/1000 N'平均時間ms' ,total_elapsed_time/1000 N'總花費時間ms' ,total_worker_time/1000 N'所用

MyBatis中實現動態SQL語句,分頁以及mybatis的常用的配置

<select id="getListByPage" resultType="com.gxa.bj.modle.UserInfoPage" parameterType="com.gxa.bj.modle.UserInfoPage">

使用ADO.NET執行帶引數的Sql語句

不帶引數的SQL語句 過載通用Update方法 /// <summary> /// 執行增、刪、改 (帶引數的SQL語句) /// <

mybatis foreach 動態插入sql語句

文章目錄 Model Service dao Mapper 有一個需求是需要寫如下的動態sql , ‘149’,‘145’ 這些個數的不確定的, 那麼就需要用到

資料庫學習SQLServer第四章 T-SQL語句

T-SQL語句是標準SQL語句的增強版,原有的SQL語句是一種結構化查詢語言 4.1.語句分類 1.變數宣告語句 2.DDL—資料定義語言(CREATE,ALTER,DROP,DECLARE) 3.DML—資料操縱語言(SELECT,DELETE,UPDATE,INSERT) 4.D

動態生成SQL語句,對資料操作

這篇主要是實現了實體類的資料庫CRUD的操作。 在目前的ORM對映框架中,對於操作資料庫的最後一個步驟就是動態生成操作資料庫的SQL語句,而這無非也就是利用實體屬性中的自定義對映機制來實現的,或者就是直接把實體類的屬性名對應表的欄位名,在本示例中,就是採用的後者。 第一

一個既包含a又包含b 的sql 語句

/* 一個查詢包含的sql 語句 條件:任意一個id,例:id=1 需求:得到name值包含條件id的name的id 例:既包含a又包含b的id 思路:一開始想著用 join 或者 exists 來解決,費勁不少,解決了

JDBC 用PreparedStatement語句動態操作SQL語句

1.Statement 和 PreparedStatement: Statement介面只能操作靜態SQL語句(即SQL語句中操作的資料表,變數等等都是固定的,不能變化的)。而PreparedStat

Mybatis之動態構建SQL語句

1.@SelectProvider[email protected]3.@UpdateProvider[email protected]http://www.cnblogs.com/zhangminghui/p/4903351.html

Mybatis:關於動態生成sql語句的一些問題

(1) <select id="selectClassByID" resultMap="ClassesResultMap" parameterType="int"> select cid,cname,sid,sname from cla

mybatise自定義外掛或者叫mybatise攔截器,動態修改sql語句

package com.teamsun.net.common.utils; import java.lang.reflect.Constructor; import java.util.Properties; import org.apache.ibatis.executo