none
使用SqlParameter 如何在參數內同時執行子查詢? RRS feed

  • 問題

  • 小弟想要在新增資料時同時將資料的某一欄位寫入一些metadata以及他所處的總筆數位置(也就是新增後取count的值)

    sql語法如下:

     

    INSERT INTO [Quiz]([Qlistno] values ('TL_'+SUBSTRING(convert(char,100000+convert(int,(select count(QuizID) from quiz))),2,5))
    

     

    假設當下已經有25筆資料了,這樣做應該是插入一筆資料,欄位值為TL_00025

     

    若改成SqlParameter則變成下面的樣子

    INSERT INTO [Quiz]([Qlistno] VALUES (@Qlistno)
    

    在程式部分再去設定SqlParameter的值為

    Qlistno.Substring(0, 12)+"SUBSTRING(convert(char,100000+convert(int,(select count(QuizID) from quiz))),2,5)")
    

    但改成用SqlParameter則會把後面的子查詢也當成文字存入,結果就會變成該欄位放了下面的資訊

    TL_SUBSTRING(convert(char,100000+convert(int,(select count(QuizID) from quiz))),2,5)

    想請問,這樣的語法該如何使用讓SqlParameter去分別子查詢使用?或是該如何改也能達到一樣的效果,麻煩指導一下,感謝

     

     

    2011年5月2日 上午 09:51

解答

  • 如果 SqlParameter 可以這樣玩,那 SQL Injection 就沒東西可以防禦了。
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    • 已標示為解答 大壯 2011年5月2日 上午 11:46
    2011年5月2日 上午 10:38
    版主

所有回覆

  • 看不出有什麼地方需要用到SqlParameter的,你直接用你原本的語法不行嗎?

    INSERT INTO [Quiz]([Qlistno] values ('TL_'+SUBSTRING(convert(char,100000+convert(int,(select count(QuizID) from quiz))),2,5))

    2011年5月2日 上午 10:16
  • 如果 SqlParameter 可以這樣玩,那 SQL Injection 就沒東西可以防禦了。
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    • 已標示為解答 大壯 2011年5月2日 上午 11:46
    2011年5月2日 上午 10:38
    版主
  • 小朱一席話點醒我了.......這實在有點蠢.... 

     

    會想要這樣做的原因只是因為前人寫了 一個function做新刪修,只是單純想follow相同的function走而已

     

     

     

     

     

     

     

     

    2011年5月2日 上午 11:45
  • 我自己也遇過相同的問題

    主要用途在大量插入資料時,需要子查詢其他 key 進來

    所以我再用寫了個簡單的 SELECTFROMWHERE 函式,透過 SqlReader 去做簡單的固定子查詢

    子查詢回來的東西再拿去給 SqlParameter 用

    只不過這樣一做下去的後果就是效能掉很多 :S

    2011年5月5日 下午 12:29