【问题标题】:Use of '' + in SQL Server 2005 Stored Procedure to build SQL string在 SQL Server 2005 存储过程中使用 '' + 构建 SQL 字符串
【发布时间】:2009-12-08 13:27:47
【问题描述】:

我正在构建一个存储过程,这会扩展我的经验。在回复此线程的人的帮助下 [Nested if statements in SQL Server stored procedure SELECT statement 我想我大部分时间都在那里:)

简而言之,SP 采用一系列参数化输入来动态构建一个 SQL 语句,该语句创建一个以特定方式排序的 id 值的临时表。 SP的剩余部分,从这个临时表中的id值,根据请求的页面返回数据,全部排序。

【问题讨论】:

  • 代码还是格式?我正在尝试通过现在编辑它来获取代码格式化潮。我们都必须从某个地方开始......
  • 这真的是非常糟糕的做法。
  • 我已经编辑让您的 sql 语句出现在引号中(这应该不那么令人困惑,因为它们在代码中的位置)

标签: sql-server stored-procedures


【解决方案1】:

重新考虑动态 SQL 的使用——如果你走这条路,你应该真的知道你在做什么。

您要解决的问题是什么?我相信这里的人们将能够找到比您建议使用的动态 SQL 更好的解决方案。

【讨论】:

    【解决方案2】:

    看看整数的 CONVERT() 和 CAST()。

    【讨论】:

      【解决方案3】:

      要将整数值连接到动态 SQL 语句中,您需要转换为 varchar,例如:

      ....WHERE
          OT.site_id = ' + CAST(@siteid AS VARCHAR)
      

      如果 SQL 语句总是少于 4000 个字符,我至少会考虑使用 sp_executesql 来使用参数化 SQL。

      例如

      DECLARE @SQL NVARCHAR(4000)
      DECLARE @siteid INTEGER
      SET @siteid = 1
      
      SET @SQL = 'SELECT * FROM MyTable WHERE site_id = @siteid'
      EXECUTE sp_executesql @SQL, N'@siteid INTEGER', @siteid
      

      总而言之,您正在做的事情不太可能是高性能/可扩展/可维护的,并且您并没有真正从将它作为存储过程中获得太多收益。另外,您需要非常小心地验证输入,因为您可能会向 SQL 注入敞开心扉(因此我的观点是使用带有参数化 SQL 的 sp_executesql)。

      【讨论】:

        【解决方案4】:

        您需要将 int 参数转换为 char/varchar,以便可以将其添加到现有字符串中。您没有在最终 sql 中用引号将其括起来这一事实意味着它将被解释为一个数字。

        【讨论】:

          猜你喜欢
          • 2010-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-31
          • 2012-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多