Sql server 2005 执行SP时出现奇怪的“无效列名”错误
我们有一个SP,在其中我们构建一个查询,然后使用exec@select调用,其中在构造SQL查询时保存该查询的变量是@select 已向我分配了一个向SP返回的结果集添加新列的请求。此新列不应在所有情况下都返回,而应仅在特定条件下返回。当然,我向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 直到今天,我的应用程序一直抛出一
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]。