大家好,是的同一个人来自早期的问题...当涉及到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
答案 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 way到SELECT @sql = 'Select count(*) from DQM.' + quotename(parsename(@Issue_table, 2)) + N'.' + quotename(parsename(@Issue_table, 1))
或PRINT
最后一个字符串,这样您就可以看到您构建的查询是否真的正确。