"ไม่พบโพรซีเดอร์ที่เก็บไว้ 'แม้ว่าจะสร้างโพรซีเดอร์ที่เก็บไว้ใน MS SQL Server Management Studio แล้ว


21

ฉันสร้างตารางtesttableภายในฐานข้อมูลtestbaseที่มีโครงสร้างต่อไปนี้:

product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)

ซึ่งฉันใช้ Microsoft SQL Server 2008 Management Studio

ฉันสร้างขั้นตอนการจัดเก็บไว้testtable_pricesmallerดังนี้

use testbase
go
create procedure testtable_pricesmaller
    @pricelimit money
as
select * from testtable where price = @pricelimit;
go

และสามารถดูกระบวนงานที่เก็บไว้ในObject ExplorerMicrosoft SQL Server Management Studio (มันอยู่ในโครงสร้างต้นไม้ต่อไปนี้ของObject Explorer)

Databases
    + testbase
        + Tables
            + dbo.testtable
        + Programmability
            + Stored Procedures
                + dbo.testtable_pricesmaller

ฉันคิดว่ามันแปลกมากเมื่อฉันได้รับข้อผิดพลาดต่อไปนี้:

Could not find the stored procedure 'dbo.testtable_pricesmaller'.

เมื่อฉันรันคำสั่ง SQL ต่อไปนี้:

execute dbo.testtable_pricesmaller 50

อะไรที่ขาดหายไป?


คุณแน่ใจหรือว่าคำสั่ง execute ของคุณทำงานภายใต้บริบทของฐานข้อมูล "testbase" คุณอาจลองเพิ่มคำสั่ง USE หรือระบุชื่อวัตถุให้ครบถ้วน
Shawn Melton

ใช่ฉันเพิ่มUSEคำสั่งแล้ว แต่ทำให้ฉันมีข้อผิดพลาด
แจ็ค

ฉันต้องกำหนดชื่อฐานข้อมูลอย่างชัดเจนในคำสั่ง execute ของฉัน: EXEC [testbase]. [dbo]. [testtable_pricesmaller] 50
Jroonk

คำตอบ:



7

คุณไม่ควรรีสตาร์ทฐานข้อมูลหลังจากเพิ่มโพรซีเดอร์ที่เก็บใหม่แม้ว่าคุณจะต้องรีเฟรชอ็อบเจกต์ explorer เพื่อดูที่นั่น

ครั้งต่อไปที่คุณเพิ่มโพรซีเดอร์ที่เก็บไว้ลองเรียกใช้ตัวเลือกดำเนินการคลิกขวาจาก Object explorer และป้อนพารามิเตอร์ของคุณและดูว่ามันรันอยู่หรือไม่ ถ้ามันไม่ทำงานฉันก็ไม่แน่ใจว่าปัญหาของคุณคืออะไร ถ้ามันทำงานแล้วมันอาจเป็นสิ่งที่ง่ายอย่าง SQL ที่พยายามสืบค้นจากฐานข้อมูลผิด


4

ในที่สุดฉันก็รู้ว่าทำไมข้อความถึงปรากฏใน MS SQL Server Management Studio

สตูดิโอการจัดการ MS SQL Server ต้องการหนึ่งเพื่อเริ่มต้นใหม่หลังจากสร้างกระบวนงานที่เก็บไว้ในนั้น

หลังจากรีสตาร์ท Studio จัดการเซิร์ฟเวอร์ MS SQL แล้วจะไม่มีข้อผิดพลาดดังกล่าวอีกต่อไป

(แปลกนั่นหมายความว่าทุกครั้งที่ฉันสร้างโพรซีเดอร์ที่เก็บไว้ฉันต้องรีสตาร์ทหรือไม่?)


12
คุณไม่ควรต้องรีสตาร์ท
Shawn Melton

1
@ShawnMelton ฉันหมายความว่าฉันปิด MS SQL Server Management Studio และเปิด MS SQL Server Management Studio อีกครั้ง ฉันเพิ่งพบว่ามันค่อนข้างแปลกที่ฉันต้องปิดแล้วเปิดใหม่อีกครั้ง มีการกำหนดค่าใด ๆ ของ MS SQL Server Management Studio (SSMS) ที่ฉันอาจหายไปส่งผลให้ SSMS ไม่สามารถสะท้อนว่า Stored Procedure ถูกสร้างขึ้นแล้วหรือไม่
แจ็ค

5
IntelliSense เป็นเพียงส่วนที่ล้าหลังของสิ่งที่คุณทำ การดำเนินการคำสั่ง exec ควรจะทำงานได้โดยไม่ต้องรีสตาร์ท SSMS มีอย่างอื่นที่สนับสนุนให้มันไม่ทำงาน ฉันเห็นด้วยกับ @ShawnMelton
Thomas Stringer

@Shark น่าสนใจ! ฉันจะขอบคุณถ้าใครสามารถอธิบายให้ฉันรู้ว่าทำไม SSMS ของฉันทำงานในลักษณะที่ฉันคิดว่ามันค่อนข้างแปลก
แจ็ค

6
สำหรับการอ้างอิงในอนาคต: Ctrl-Shift-R จะรีเฟรชแคชภายในเครื่องสำหรับการใช้งานภายใน
Adam Scharp

3

คำสั่งสร้างของคุณควรเป็น

create procedure dbo.testtable_pricesmaller
    @pricelimit money

คุณหายไปdbo.ก่อนชื่อขั้นตอน เมื่อใดก็ตามที่คุณสร้างโพรซีเดอร์จะเป็นการดีที่จะกำหนด user / schema อย่างชัดเจนด้วยชื่อของโพรซีเดอร์เช่นชื่อโพรซีเดอร์ควรมีลายเซ็นที่ผ่านการรับรองโดยสมบูรณ์

ฉันหวังว่านี่จะช่วยคุณได้


3

ใน SQL Server 2008 เมื่อเข้าสู่ระบบภายใต้บัญชี Windows ถ้าคุณไม่มีระดับความปลอดภัย SYSADMIN เมื่อคุณสร้างวัตถุโดยไม่ระบุ schema อย่างชัดเจนอาจ / จะสร้างมันภายใต้ [DOMAIN \ ชื่อผู้ใช้] [ObjectName ] แทน [dbo] [ObjectName] (ได้รับการแก้ไขใน SQL Server 2012 ฉันคิดว่า)

ฉันมีปัญหานี้เกิดขึ้นกับฉันเมื่อฉันลดระดับความปลอดภัยของผู้ใช้และหนึ่งในขั้นตอนที่เขาดำเนินการก็คือการวางและสร้างตารางใหม่โดยไม่ต้องใช้สคีดังนั้นขั้นตอนที่เหลือก็ล้มเหลวเพราะไม่สามารถเข้าถึงวัตถุได้อีก . ปรากฎว่าตารางถูกสร้างขึ้นภายใต้ชื่อผู้ใช้โดเมนของเขา

นี่คือ Microsoft โพสต์เกี่ยวกับพฤติกรรมนี้:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (ค้นหาหัวข้อ "Schema โดยนัยและการสร้างผู้ใช้")

ตารางไม่ถูกสร้างภายใต้ dbo schema

SQL 2008 R2 สร้างผู้ใช้ / สคีมาเมื่อผู้ใช้ Windows สร้างตาราง

ดังนั้นในระยะสั้นคุณอาจมีปัญหาฐานข้อมูล (คุณสร้างตารางของคุณในฐานข้อมูล แต่พยายามเข้าถึงจากฐานข้อมูลอื่น) หรือคุณมีปัญหาตามที่ฉันเพิ่งอธิบาย


2

ฉันรู้ว่ามันเก่า ฉันเจอคำถามนี้ในขณะที่ฉันกำลังค้นหาวิธีแก้ไขปัญหาเดียวกันนี้และฉันโพสต์คำตอบนี้ด้วยความหวังว่าจะช่วยให้ผู้อื่นที่พบคำถามนี้ด้วย

ในกรณีของฉันฉันได้รับข้อความแสดงข้อผิดพลาดขณะเรียกใช้รายงาน SSRS โดยใช้แหล่งข้อมูลที่ใช้ร่วมกัน แหล่งข้อมูลที่ใช้ร่วมกันนี้ไม่ได้ระบุฐานข้อมูลเริ่มต้น (พารามิเตอร์เริ่มต้น = พารามิเตอร์) และฉันไม่สามารถเพิ่มลงในสตริงการเชื่อมต่อได้เนื่องจากฉันไม่มีรหัสผ่าน (และเมื่อคุณเปลี่ยนบางสิ่งในแหล่งข้อมูล SSRS เพื่อต้องการให้คุณป้อนรหัสผ่านอีกครั้ง)

เพื่อแก้ปัญหานี้ฉันเปลี่ยนฐานข้อมูลเริ่มต้นสำหรับการเข้าสู่ระบบในอินสแตนซ์ SQL Server จากต้นแบบเป็นฐานข้อมูลที่มีขั้นตอนการจัดเก็บที่รายงานต้องการดำเนินการ

เมื่อเรียกใช้สิ่งต่าง ๆ จาก SSMS โปรดจำไว้ว่าบานหน้าต่างวัตถุ Explorer คือการเชื่อมต่อเดียวในขณะที่ตัวแก้ไขใดก็ตามที่คุณมีคือการเชื่อมต่อที่แตกต่างกันโดยสิ้นเชิง ดังนั้นคุณอาจเห็นวัตถุสำหรับ SQL01 ใน Object Explorer แต่รหัสที่คุณใช้ในโปรแกรมแก้ไขจะทำงานกับ SQL02 - ฉันพบปัญหานี้สองสามครั้งในช่วงหลายปีที่ผ่านมา มันใช้งานได้หรือ " ตระหนักถึงความผิดพลาดของฉัน สำหรับเครื่องมือแก้ไขให้ดูที่มุมด้านล่างขวาเพื่อดูอินสแตนซ์และฐานข้อมูลที่คุณเชื่อมต่อ


1

TL: DR:คุณอาจมีกระบวนงานที่เก็บไว้ซึ่งเรียกขั้นตอนการจัดเก็บอื่นที่ไม่มีอยู่


ฉันมีปัญหานี้และพบวิธีแก้ไข นี่คือสิ่งที่เกิดขึ้น ฉันสร้างหนึ่งกระบวนงานที่เก็บไว้:

create procedure dbo.MyProc
    ...

ฉันสร้างขั้นตอนการจัดเก็บอื่นที่ดำเนินการขั้นตอนแรก

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc
    ...

บางเวลาต่อมาผมเปลี่ยนไปdbo.MyProc dbo.MyProc2หลังจากเปลี่ยนชื่อแล้วเมื่อฉันพยายามโทรdbo.MyProcCallerฉันจะได้รับข้อความแสดงข้อผิดพลาดนี้:

exec dbo.MyProcCaller

ไม่พบกระบวนงานที่เก็บไว้ 'RLM.usp_getSecondaryRestrictedLists_Old'

โซลูชันของฉันคือแก้ไขขั้นตอนการจัดเก็บที่สองเพื่อใช้ชื่อใหม่:

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc2
    ...

นี่เป็นวิธีง่ายๆในการตรวจสอบว่าคุณมีปัญหานี้หรือไม่ คลิกเพื่อปรับเปลี่ยนข้อความของกระบวนงานที่เก็บไว้จากนั้นเรียกใช้ข้อความนั้น หากคุณได้รับคำเตือนเช่นนี้คุณต้องเปลี่ยนชื่อกระบวนงานที่เก็บไว้:

โมดูล 'dbo.MyProcCaller' ขึ้นอยู่กับวัตถุที่ขาดหายไป 'dbo.MyProc' โมดูลจะยังคงถูกสร้างขึ้น; อย่างไรก็ตามมันไม่สามารถทำงานได้สำเร็จจนกว่าวัตถุจะมีอยู่

(1 แถวได้รับผลกระทบ)


0

คำถามนี้ไม่กี่ปีที่ผ่านมา แต่ฉันเพียงต้องการที่จะโยนในความเป็นไปได้อื่นสำหรับทุกคนเช่นฉันที่พบมันในภายหลัง

ฉันรันคำสั่งนี้: EXEC SP_CONFIGURE 'Agent XPs'

และได้รับข้อผิดพลาดที่อธิบาย: ข่าวสารเกี่ยวกับ 2812 ระดับ 16 สถานะ 62 บรรทัด 1 ไม่พบกระบวนงานที่เก็บไว้ 'SP_CONFIGURE'

แต่ฉันจำได้ว่าเซิร์ฟเวอร์นี้ตั้งค่าเป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก ดังนั้นคำสั่งนี้ใช้งานได้ดี: EXEC sp_configure 'Agent XPs'

HTH

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.