0

大家好,是的,来自较早问题的同一个人......在游标/SQL方面我真的很糟糕我一直在使用我制作的以下存储过程/游标..它编译正确,当我出现问题时尝试执行它我得到这个错误:

消息 208,级别 16,状态 1,第 1 行无效的对象名称“DQM.dbo.ST_0043_BLANK_CONSENT_SAP_SIEBEL”。

(0 行受影响)消息 208,级别 16,状态 1,第 1 行无效的对象名称“DQM.dbo.ST_0044_CONSENT_SIEBEL_SAP_DIFF”。

(0 行受影响)消息 208,级别 16,状态 1,第 1 行无效的对象名称“DQM.dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF”。

现在我知道所有这些对象都存在,因为当我全选时,我会返回行。任何帮助,将不胜感激。

    USE [Adhoc_datafix]
GO
/****** Object:  StoredProcedure [dbo].[CostTest_02]    Script Date: 01/10/2013 15:43:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[CostTest_02]
AS
BEGIN

DECLARE @Issue_id int;
DECLARE @Master_id int;
DECLARE @Issue_table varchar(255);
DECLARE @price real;
DECLARE @rowcount bigint;
DECLARE @sql varchar(3000)


DECLARE cost_cursor cursor FOR
SELECT [Issue Id], [Master Issue Id], [Issue Table], [Price]
from Adhoc_datafix..[IssueTable]
FOR UPDATE OF [Issue Id];

OPEN cost_cursor;
FETCH NEXT FROM cost_cursor into @Issue_ID, @Master_id, @Issue_table, @Price

WHILE @@FETCH_STATUS = 0
BEGIN


SELECT @sql = 'Select count(*) from DQM.' + quotename(@Issue_table)
EXEC(@sql)
set @Rowcount = @@rowcount


UPDATE ADHOC_DATAFIX..[Issue Cost]
set [Issue Id] = @Issue_ID ,
    [Master Issue Id] = @Master_ID ,
    [Row Count] = @Rowcount,
    [Cost] = CAST(@Rowcount * @price as money)

--WHERE CURRENT OF cost_cursor;
FETCH NEXT FROM cost_cursor into @Issue_ID, @Master_id, @Issue_table, @Price
END

close cost_cursor;

DEALLOCATE cost_cursor;
END
4

1 回答 1

1

问题似乎是您正在使用QUOTENAME()将架构和表名一起引用:

select quotename('dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF')
-- returns [dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF]

因此 SQL Server 认为您正在尝试查询架构中调用[dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF]的表:DQM

select * from DQM.[dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF]

但是您确实想查询架构中调用[ST_0045_CONSENT_SIEBEL_BANNER_DIFF]的表:dbo

select * from DQM.dbo.[ST_0045_CONSENT_SIEBEL_BANNER_DIFF]

要解决此问题,请dbo.@Issue_Table字符串的开头删除前缀并在 之后对其进行硬编码DQM,或者如果您想支持不同的模式,请使用PARSENAME()分别获取模式和表名:

SELECT @sql = 'Select count(*) from DQM.' + quotename(parsename(@Issue_table, 2)) + N'.' + quotename(parsename(@Issue_table, 1))

作为一般建议,每当您使用动态 SQL 时,给自己一个简单的方法PRINT最终SELECT字符串,这样您就可以查看您构建的查询是否真的正确。

于 2013-01-10T16:23:29.593 回答