无效的对象名称'DQM.dbo.ST_0043_BLANK_CONSENT_SAP_SIEBEL'

时间:2013-01-10 15:51:43

标签: sql sql-server cursor

大家好,是的同一个人来自早期的问题...当涉及到Cursors / SQL时,我真的很糟糕 我一直在使用下面的存储过程/光标。它编译正确,当我尝试执行它时出现问题我收到此错误:

Msg 208,Level 16,State 1,Line 1 无效的对象名称'DQM.dbo.ST_0043_BLANK_CONSENT_SAP_SIEBEL'。

(0行(s)受影响) Msg 208,Level 16,State 1,Line 1 无效的对象名称'DQM.dbo.ST_0044_CONSENT_SIEBEL_SAP_DIFF'。

(0行(s)受影响) Msg 208,Level 16,State 1,Line 1 无效的对象名称'DQM.dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF'。

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

    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

1 个答案:

答案 0 :(得分: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之后对其进行硬编码,或者如果要支持不同的模式,请使用{{ 1}}分别获取模式和表名:

PARSENAME()

作为一般建议,每当您使用动态SQL时,give yourself an easy waySELECT @sql = 'Select count(*) from DQM.' + quotename(parsename(@Issue_table, 2)) + N'.' + quotename(parsename(@Issue_table, 1)) PRINT最后一个字符串,这样您就可以看到您构建的查询是否真的正确。