Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 执行SP时出现奇怪的“无效列名”错误_Sql Server 2005_Stored Procedures - Fatal编程技术网

Sql server 2005 执行SP时出现奇怪的“无效列名”错误

Sql server 2005 执行SP时出现奇怪的“无效列名”错误,sql-server-2005,stored-procedures,Sql Server 2005,Stored Procedures,我们有一个SP,在其中我们构建一个查询,然后使用exec@select调用,其中在构造SQL查询时保存该查询的变量是@select 已向我分配了一个向SP返回的结果集添加新列的请求。此新列不应在所有情况下都返回,而应仅在特定条件下返回。当然,我向SP添加了以下代码 IF @conditionIsMet BEGIN set @select = @select + ", 'compQty' = convert(varchar(53), di.qty) " END 直到今天,我的应用程序一直抛出一

我们有一个SP,在其中我们构建一个查询,然后使用exec@select调用,其中在构造SQL查询时保存该查询的变量是@select

已向我分配了一个向SP返回的结果集添加新列的请求。此新列不应在所有情况下都返回,而应仅在特定条件下返回。当然,我向SP添加了以下代码

IF @conditionIsMet
BEGIN
set @select =  @select + ", 'compQty' = convert(varchar(53), di.qty) "
END
直到今天,我的应用程序一直抛出一个SQL异常,并显示一条消息:无效列名:compQty。这是不稳定的,并且不总是抛出异常

在SQL Server Management Studio中执行SP不会出现错误。该列以标题“compQty”呈现。因此,应用程序应该选择列,但它似乎没有


有人能帮忙吗?

不要将列名用单引号“compQty”括起来。

在我看来,带引号的标识符是这里的问题

您的环境中引用的标识符的设置似乎已更改,这导致了异常。在查询开始时使用此选项:

设置“U标识符”为OFF


编辑:您有时会被抛出问题,有时不会,因为您的IF条件并不总是满足。

与@Tapori确定的引用标识符问题相关:如果存储的过程看起来像:

CREATE PROCEDURE [dbo].[usp_Something]
AS
   SET QUOTED_IDENTIFIER OFF

   DECLARE @select NVARCHAR(200)

   SET @select = 'SELECT * FROM table WHERE ''col1'' = 42'
GO
那你就有麻烦了。问题是QUOTED_标识符的设置与存储过程的执行无关,与存储过程的创建无关。所以你实际上需要做:

SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [dbo].[usp_Something]
AS
   DECLARE @select NVARCHAR(200)

   SET @select = 'SELECT * FROM table WHERE ''col1'' = 42'
GO

然后看看它会起什么作用。

如果在多个模式中有相同的表,您可能会面临

无效的列名


解决方案:模式的显式定义:[schemaName].[tableName]

@Mitch,我确实尝试过这个,它工作了一段时间,但问题又回来了。此外,在此之前还有其他字段,它们有单引号。这些似乎没有问题。@Tapori,我们确实在SP的开始处设置了ANSI_null并设置了QUOTED_IDENTIFIER。@Tapori,我们的流程是SP将执行两次—第一次,条件不满足,第二次,条件满足。所以,如果它因为if而失败,它应该每次都失败。但这里不是这样-它第一次失败,然后我按照@Mitch的建议删除了列名周围的引号,它成功了,现在又失败了。记录@Select的值,比较it worked和it failed,看看是否有错误pattern@KM,当它失败时,我在ManagementStudio中运行SP,可以看到compQty列。似乎resultSet.getStringcompQty没有看到compQty列。您是否尝试过完全指定列,即tablename.compQty?此外,与其使用引号,不如使用方括号,即[tablename][compQty]。