카테고리 보관물: Sql

sql

저장 프로 시저가 MS SQL Server Management Studio에서 생성되었지만 “저장 프로 시저를 찾을 수 없습니다” * from testtable where price =

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

무엇을 놓칠 수 있습니까?



답변


IntelliSense Refresh 로컬 캐시가이를 수정해야합니다


답변

새 스토어드 프로 시저를 추가 한 후 데이터베이스를 다시 시작할 필요는 없지만 오브젝트 탐색기를 새로 고쳐서 볼 수 있습니다.

다음에 스토어드 프로 시저를 추가 할 때 오브젝트 탐색기에서 마우스 오른쪽 단추로 실행 옵션을 실행하고 매개 변수를 입력하고 실행되는지 확인하십시오. 실행되지 않으면 문제가 무엇인지 잘 모르겠습니다. 실행되면 SQL이 잘못된 데이터베이스에서 쿼리하려고하는 것과 같은 간단한 것일 수 있습니다.


답변

마침내 메시지가 MS SQL Server Management Studio에 나타나는 이유를 알고 있습니다.

MS SQL Server Management Studio에서는 저장 프로 시저를 만든 후 다시 시작해야합니다.

MS SQL Server Management Studio를 다시 시작한 후에는 더 이상 그러한 오류가 없습니다.

(이상하게, 저장 프로 시저를 만들 때마다 다시 시작해야합니까?)


답변

작성 명령은

create procedure dbo.testtable_pricesmaller
    @pricelimit money

dbo.프로 시저 이름 앞에 누락되었습니다 . 프로 시저를 작성할 때마다 프로 시저 이름으로 사용자 / 스키마를 명시 적으로 정의하는 것이 좋습니다. 즉, 프로 시저 이름에는 완전한 서명이 있어야합니다.

이것이 도움이되기를 바랍니다.


답변

SQL Server 2008에서 Windows 계정으로 로그인 할 때 SYSADMIN 보안 수준이없는 경우 스키마를 명시 적으로 지정하지 않고 개체를 만들면 [DOMAIN \ username]에서 개체를 만들거나 만들 수 있습니다. [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 ( “암시 적 스키마 및 사용자 생성”섹션 참조)

dbo 스키마에서 테이블이 작성되지 않음

Windows 사용자가 테이블을 만들 때 SQL 2008 R2가 사용자 / 스키마를 만듭니다.

간단히 말해 데이터베이스 문제가 있거나 (데이터베이스에 테이블을 만들지 만 다른 테이블에서 액세스하려고하면) 방금 설명한 것과 같은 문제가 있습니다.


답변

나는 이것이 오래되었다는 것을 안다. 나는이 같은 문제에 대한 해결책을 찾고있는 동안이 질문을 보았 으며이 질문을 찾는 다른 사람들을 돕기 위해이 답변을 게시하고 있습니다.

제 경우에는 공유 데이터 소스를 사용하여 SSRS 보고서를 실행하는 동안 오류 메시지가 나타납니다. 이 공유 데이터 소스는 기본 데이터베이스 (Default Catalog = 매개 변수)를 지정하지 않았으며 비밀번호가 없기 때문에 연결 문자열에 추가 할 수 없었습니다 (SSRS 데이터 소스에서 무언가를 변경하면 비밀번호를 다시 입력하기를 원합니다).

이를 해결하기 위해 SQL Server 인스턴스의 로그인 기본 데이터베이스를 마스터에서 보고서가 실행하려는 저장 프로 시저가 포함 된 데이터베이스로 변경했습니다.

SSMS에서 항목을 실행할 때 개체 탐색기 창은 하나의 연결이며 편집기는 완전히 다른 연결입니다. 개체 탐색기에서 SQL01에 대한 개체가 표시 될 수 있지만 편집기에서 실행중인 코드는 SQL02에 대해 실행됩니다. 몇 년 동안이 문제는 몇 년에 걸쳐 많이 발생했습니다. 작동합니까? ” 내 실수를 깨달았다. 편집기의 경우 오른쪽 하단에서 연결된 인스턴스 및 데이터베이스를 확인하십시오.


답변

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 개의 행이 영향을 받음)