none
这样的存储过程怎么写? RRS feed

  • 问题

  • 我在存储过程中,需要查询带条件的语句,比如说select * from a where XXX,可以这个XXX不是固定的,是动态的,
    这个除了写成exec('select * from a where '+XXX),还有没有更好的办法?我很讨厌这种方式。
    2009年11月23日 3:39

答案

  • 我在存储过程中,需要查询带条件的语句,比如说select * from a where XXX,可以这个XXX不是固定的,是动态的,
    这个除了写成exec('select * from a where '+XXX),还有没有更好的办法?我很讨厌这种方式。
    只能这样了
    or
    sp_executesql
    More: blog.csdn.net/happyflystone
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月23日 5:14
  • 讨厌写成exec('select * from a where '+XXX)

    这种情况只有拼接的
    因为你是在语句级,而不是在真正的执行级

    下面这种是可以的
    declare @columns varchar(100)='Oper_id'
    exec sp_executesql N'select @columns from s_operator',N'@columns varchar(100)',@columns

    但是你要把where用参数也是不行的,因为你需要个bool值 但是bool值的计算需要借助表中的列
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月23日 5:24
  • 動態只能用動態語法實現 或用程序控制

    沒有什麼方法可言
    或用sp_sqlexec
    都一樣
    ROY WU(吳熹)
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月23日 9:29
    版主
  • 动态的查询只有采用 exec 或者 sp_executesql
    请楼主说明一下您讨厌这种方式的原因。

    Jeffrey
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月24日 4:52
  • 只要写的时候注意可性就好了. 建议使用sp_executesql,因为它支持输出参数作为调用批处理中的变量返回值,而exec需要通过零时表.
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月24日 14:20

全部回复

  • Tried with parameter?

    2009年11月23日 3:43
  •  你是讨厌exec 这个存储过程 还是这种方式?

    sp_executesql也可以
    2009年11月23日 4:09
  • 讨厌写成exec('select * from a where '+XXX)
    2009年11月23日 5:06
  • 我在存储过程中,需要查询带条件的语句,比如说select * from a where XXX,可以这个XXX不是固定的,是动态的,
    这个除了写成exec('select * from a where '+XXX),还有没有更好的办法?我很讨厌这种方式。
    只能这样了
    or
    sp_executesql
    More: blog.csdn.net/happyflystone
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月23日 5:14
  • 讨厌写成exec('select * from a where '+XXX)

    这种情况只有拼接的
    因为你是在语句级,而不是在真正的执行级

    下面这种是可以的
    declare @columns varchar(100)='Oper_id'
    exec sp_executesql N'select @columns from s_operator',N'@columns varchar(100)',@columns

    但是你要把where用参数也是不行的,因为你需要个bool值 但是bool值的计算需要借助表中的列
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月23日 5:24
  • 動態只能用動態語法實現 或用程序控制

    沒有什麼方法可言
    或用sp_sqlexec
    都一樣
    ROY WU(吳熹)
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月23日 9:29
    版主
  • 你可以在程序里面拼接字符串 利用ado.net 的sqlcommand来执行 就可以不用exec or sp_executesql

    或者把sql定死 然后传@id ,@date,@money等参数进来查询值
    或者在程序里面过滤datatable 的行记录

    2009年11月23日 9:41
  • 动态的查询只有采用 exec 或者 sp_executesql
    请楼主说明一下您讨厌这种方式的原因。

    Jeffrey
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月24日 4:52
  • 因为如果你的存储过程写的很复杂或者写的代码很多,看上去就去一大片红的字符串,这是原因之一,
    第二,你将来改起来里面的内容很不好改,因为全是红色的字符串,
    第三,不知道还能不能调试,或者说还好不好调试。
    2009年11月24日 5:33
  • 因为如果你的存储过程写的很复杂或者写的代码很多,看上去就去一大片红的字符串,这是原因之一,
    第二,你将来改起来里面的内容很不好改,因为全是红色的字符串,
    第三,不知道还能不能调试,或者说还好不好调试。
    对于动态语句,sql server没有什么更好的方法了。
    不过要解决一大片红字的问题,你倒是可以用变量的方法通过程序组合你的字符串。

    如果不使用动态语句,可以使用参数的办法。
    2009年11月24日 7:01
  • 首先,我不想把一大片红字的代码放到程序中。
    第二,我不想使用exec,因为全部是红字,
    那么,我只能使用sp_executesql了,如果存储过程比较长,会不会sp_executesql传的某个参数也避免不了一大片红字?
    2009年11月24日 7:50
  • 只要写的时候注意可性就好了. 建议使用sp_executesql,因为它支持输出参数作为调用批处理中的变量返回值,而exec需要通过零时表.
    • 已标记为答案 m s 2009年11月25日 1:18
    2009年11月24日 14:20