【问题标题】:Dynamic SQL Insert: Column name or number of supplied values does not match table definition动态 SQL 插入:列名或提供的值的数量与表定义不匹配
【发布时间】:2015-07-31 21:41:09
【问题描述】:

我在动态 SQL 查询中遇到了一些奇怪的行为。 在存储过程中,我从多个字符串中构造了一个插入查询字符串。我像这样在 SP 中执行插入查询 - 由于单个 nvarchar 长度限制。

EXEC(@QuerySelectPT+@QueryFromPT+@QueryFromPT)

如果我打印查询的每个部分,将这些部分放在一起并在 Management Studio 中手动执行,查询工作正常并插入数据。但是,如果我在存储过程的 EXEC() 方法中执行查询,我会得到一个

Column name or number of supplied values does not match table definition.

错误信息。

对我的查询和插入表中的列的数量、拼写进行了多次检查,但到目前为止我还没有发现任何差异。

有什么建议吗?

【问题讨论】:

  • 查询的字符串部分之间是否有空格?
  • 在此处粘贴整个字符串。你提供的信息还不够。我自己犯了这样的错误 - 再次检查最后的字符串
  • 回显@QuerySelectPT+@QueryFromPT+@QueryFromPT 以及它生成的SQL
  • 不可能是客户端,但字符串部分之间有空格,并且查询中有换行符。但整个查询的打印工作
  • 看不到整个查询,但这是 sql 注入漏洞的尖叫声。参数化你的动态 sql 而不是仅仅构建一个字符串并执行它会更好。

标签: sql-server tsql


【解决方案1】:

插入的列数与选择的列数不同。打印exec之前的语句,发现错误。

【讨论】:

    【解决方案2】:

    它是在黑暗中拍摄的,但看到您告诉查询是有效的,如果您手动构建最终查询并且它正在工作,那么问题可能是由字符串截断引起的。

    你可以试试:

    EXEC(CAST(@QuerySelectPT AS VARCHAR(MAX))+@QueryFromPT+@QueryFromPT);
    

    此外,我认为Management Studio 的消息选项卡和选择仅限于4000 符号,您可以测试整个查询是否正确组装:

    SELECT CAST(@QuerySelectPT+@QueryFromPT+@QueryFromPT AS XML)
    

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2010-11-12
      相关资源
      最近更新 更多