【问题标题】:Call sp_executesql with varchar parameter使用 varchar 参数调用 sp_executesql
【发布时间】:2018-02-26 23:35:33
【问题描述】:

当我调用 sp_executesql 并传递 varchar 参数时遇到问题。
我收到了这个错误:

过程需要类型为“@statement”的参数 'ntext/nchar/nvarchar'。

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    心理调试器说你要么传递给SP_ExecuteSQL一个varchar类型的变量(让它变成nvarchar),要么你有一个没有使用unicode前缀的字符串:

    例如

    Exec sp_executesql 'select * from something'
    

    要修复它,请使用:

    Exec sp_executesql N'select * from something'
    

    注意字符串上的N 前缀。

    【讨论】:

    • 我将 @SQL 构造为 varchar 参数,然后将其传递给 sp_executesql。
    • 那么我已经告诉你如何修复它了——将它声明为一个适当长度的 nvarchar 参数(如果需要超过 4000 个字符,请使用 nvarchar(max))。
    • 我做了同样的事情,@SQL 被修剪并且不能包含我构建的所有动态查询。
    • 它是否直接与Exec 一起使用而不是使用sp_executesql(如果您不使用参数应该很容易测试)。另外,为什么不将您的脚本分成批次?我怀疑它需要那么长。
    【解决方案2】:

    这意味着sp_executesql@statement 参数需要nvarchar

    意味着你的参数必须是nvarchar。
    当然,如果你没有参数,你为什么要使用 sp_executesql?

    CREATE TABLE #foo (bar varchar(100) NOT NULL);
    DECLARE @filter varchar(100) = 'bob';
    EXEC sys.sp_executesql
          N'SELECT * FROM #foo WHERE bar = @p1', --NVARCHAR because of N prefix
          N'@p1 varchar(100)', --NVARCHAR because of N prefix
          @filter --VARCHAR
    DROP TABLE #foo
    

    【讨论】:

    • 我正在构建一个字段更改的动态查询。
    【解决方案3】:

    试试这个:

    例如这将给出错误,因为@SQL 需要是 NVARCHAR

    下面给出错误:

    DECLARE @SQL VARCHAR(100)
    SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
    EXECUTE sp_executesql @SQL
    

    所以:使用NVARCHAR(100)

    DECLARE @SQL NVARCHAR(100)
    SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
    EXECUTE sp_executesql @SQL
    

    【讨论】:

    猜你喜欢
    • 2013-01-27
    • 2023-03-30
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多