【问题标题】:SQL with table name as parameter and query longer than 4000 characters以表名为参数且查询长度超过 4000 个字符的 SQL
【发布时间】:2009-11-24 16:24:21
【问题描述】:

我正在尝试编写一个以表名作为参数的存储过程。是的,我已经知道这是一个安全漏洞,但这是一个内部存储过程,不会面临 SQL 注入的典型风险。

到目前为止,我所拥有的是以下内容:

CREATE PROCEDURE [dbo].[myprocedure]
    @tableName sysname
AS
DECLARE @cmd nvarchar(4000)
SET @cmd = N' Select blah blah from ' + @tableName
EXEC (@cmd)
GO

该查询理论上可以工作,但我的问题是我的查询长度超过 4000 个字符。是否有另一种方法可以在长度超过 4000 个字符(这是 nvarchar 的最大值)的 cmd 变量中使用 @tableName?

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

    如果您使用 SQL Server >= 2005,请尝试将 nvarchar(4000) 替换为 nvarchar(MAX)

    【讨论】:

    • 那行不通。我正在运行 SQL Server 2005。问题是 MAX 实际上是 4000。
    • @a432511:这不正确。 varchar(MAX) 的最大大小为 2^31。
    • 嗯...我开始认为您对这个建议是正确的,它可能解决了我的主要问题,但我的查询中也存在语法问题。感谢您的帮助!
    【解决方案2】:
    DECLARE @cmd NVARCHAR(MAX);
    

    【讨论】:

    • 那行不通。我正在运行 SQL Server 2005。问题是 MAX 实际上是 4000。
    • 不,MAX 是 2^31-1,实际上是 2147483647
    • 1+ 你和 Heinzi 一样是正确的,但他首先回应。感谢您的帮助
    【解决方案3】:

    将您的一些逻辑提取到视图或用户定义的函数中。

    【讨论】:

      【解决方案4】:

      使用

      DECLARE @cmd VARCHAR(8000)
      

      而不是DECLARE @cmd NVARCHAR(MAX);

      NVARCHAR(MAX) ALLOWS ONLY 4000 CHARACTERS.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多