【问题标题】:SP_ExecuteSQL with Parameters doesn't like Contains clause带参数的 SP_ExecuteSQL 不喜欢包含子句
【发布时间】:2013-02-28 20:12:45
【问题描述】:

我的任务是修改一个存储过程,使其看起来像这样:

DECLARE @ID nvarchar(10)
SET @ID = '0000000001'

DECLARE @SQL nvarchar(200)
SET @SQL = 'SELECT AppN FROM Apps WHERE CONTAINS(ID, ''"*'' + @ID + ''*"'')'

EXECUTE SP_EXECUTESQL @SQL

使用 SP_EXECUTESQL 的参数列表而不是字符串连接。问题是以下似乎不起作用:

DECLARE @CID nvarchar(10)
SET @CID = '0000000001'

DECLARE @ID2 nvarchar(14)
SET @ID2 = '"*' + @ID + '*"'

DECLARE @SQL nvarchar(200)
SET @SQL = 'SELECT AppN FROM Apps WHERE CONTAINS(ID, ID2)'

DECLARE @ParamDefinition NCHAR(300)
SET @ParamDefinition = '@ID2        nvarchar(10)'

EXECUTE SP_EXECUTESQL @SQL, @ParamDefinition, @ID2

无论出于何种原因,第一组语句都可以正常工作。第二个没有。我收到以下错误消息:Syntax error near '"' in the full-text search condition '"*00000000'.

如果我从 @ID 中删除 4 个字符,则第二组语句也有效。显然它与@IDID 列的长度有关,但我不知道是什么。

【问题讨论】:

    标签: sql sql-server sp-executesql


    【解决方案1】:

    您在动态 SQL 的参数中将 @ID2 定义为 nvarchar(10)

    它实际上是 14 个字符,所以你要切断它的结尾。

    这会为我输出正确的变量:

    DECLARE @CID nvarchar(10)
    SET @CID = '0000000001'
    
    DECLARE @ID2 nvarchar(14)
    SET @ID2 = '"*' + @CID + '*"'
    
    DECLARE @SQL nvarchar(200)
    SET @SQL = 'SELECT @ID2'
    
    DECLARE @ParamDefinition NCHAR(300)
    SET @ParamDefinition = '@ID2        nvarchar(14)'
    
    EXECUTE SP_EXECUTESQL @SQL, @ParamDefinition, @ID2
    

    【讨论】:

    • 好吧,我觉得自己像个彻头彻尾的傻瓜。我已经盯着这个看了一个多小时,这是我唯一没有检查过的长度。我最初将它设置为 ID 在数据库 (10) 中的值,当我让它更长以容纳双引号和星号时忘记添加 4。谢谢。
    • 没问题,有时只需要第二双眼睛。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多