避免動態sql的兩個方法

來源:互聯網
上載者:User

所謂動態SQL,就是執行前語句不確定,執行過程中才知道具體內容的語句。相對來說,靜態SQL就是執行前就清楚執行內容的SQL。

舉例來說,select * from TableA 就是一個靜態SQL。

如果想在執行過程中動態改變表名或者參數,就是動態SQL。比如這個:

 DECLARE @Sql VARCHAR(200);
  DECLARE @GroupName VARCHAR(50);
  SET @GroupName = 'SuperAdmin';
  SET @Sql = 'SELECT * FROM Groups WHERE GroupName=''' + SUBSTRING(@GroupName, 1,5) + ''''
  --PRINT @Sql;
  EXECUTE (@Sql);

動態SQL也可以用預存程序SP_EXECUTESQL來執行,與Execute命令類似。

動態SQL顯然比靜態SQL更靈活,不過效率上要低於靜態SQL,因為靜態SQL可以事先編譯。另外動態SQL安全上也可以產生注入漏洞。還有就是代碼可讀性上來說動態SQL不如靜態SQL。

我前一段時間做了幾個T-SQL編程項目,在不改變需求的情況下避免了使用動態SQL,以下是一些具體的做法。

1:使用暫存資料表來儲存變數。下面例子中@StaffName可以輸入一個或多個員工姓名,也可以為空白,為空白的話表示要查全部員工的資訊。

 if @StaffName = ''
  insert into #StaffName(StaffName)
  select distinct StaffName
  from Staff s
  where BeginDate <= @DateEnd and EndDate >= @DateStart
 else
  insert into #StaffName
  SELECT *
  FROM dbo.fn_split_string(@StaffName,',')
  
 select *
 from dbo.class c(nolock)
  inner join dbo.class_detail d(nolock) on c.class_id = d.class_id
  inner join dbo.calendar ca (nolock) on ca.date between l.leave_str and l.leave_end
   and ca.weekday = d.class_time
  inner join #StaffName s on l.staff_name = s.StaffName
  
其中fn_split_string是一個把字串拆為表的函數。

2:在where子句中做文章。下面這個例子中,如果設定@Price為-1,表示不使用這個參數去限制記錄集。否則這個參數有效。

 declare @Price int
 set @Price = -1

 SELECT *
 FROM TableA
 where (@Price > HighestPrice or @Price = -1)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.