/ / sqlstate 5001 error „W bazie danych istnieje już obiekt o nazwie PKCURSOR” - sql-server, tsql

błąd sqlstate 5001 „W bazie danych istnieje już obiekt o nazwie PKCURSOR” - sql-server, tsql

Mamy aplikację Powerbuilder, która działała dobrze na 2000 db przed migracją do 2005. Teraz otrzymujemy następujący błąd:

sqlstate 5001 error „Istnieje już obiekt o nazwie PKCURSOR w pliku Baza danych"

Poniższy kod częściowy został zmodyfikowany przezdodanie przeciwwagi upuszczenia PKCURSOR. Tak więc błąd nie pojawia się teraz dla dwóch dba, które mają zainstalowany powerbuilder i uruchamiają aplikację ze swojego dysku sieciowego. Drugi użytkownik uruchamia ją ze swojego dysku sieciowego i otrzymuje błąd. Zrobiłem również tego użytkownika dbo i nadal pojawia się błąd. Jakieś pomysły?

ALTER PROCEDURE [dbo].[GUMBO_SP_PROP_ACTUAL_ACCOMPLISHMENTS_PF]
@PROG_YEAR CHAR(4)
AS

DECLARE @PROGRAM_YEAR                   CHAR(4),
@SUM_LOW_MOD_PERSONS_PROPOSED   INTEGER,
@SUM_LOW_MOD_PERSONS_ACTUAL     INTEGER,
@SUM_TOTAL_PERSONS_PROPOSED     INTEGER,
@SUM_TOTAL_PERSONS_ACTUAL       INTEGER,
@ERROR_STRING                   CHAR(132),
@ACTIVITY_CODE                  CHAR(3)

CREATE TABLE #ACCOMPLISHMENTS(
PROGRAM_YEAR                CHAR(4) NOT NULL,
ACTIVITY_CODE               CHAR(3) NOT NULL,
TOTAL_PERSONS_PROPOSED      DECIMAL(18,2) DEFAULT 0,
TOTAL_PERSONS_ACTUAL        DECIMAL(18,2) DEFAULT 0,
LOW_MOD_PERSONS_PROPOSED    DECIMAL(18,2) DEFAULT 0,
LOW_MOD_PERSONS_ACTUAL      DECIMAL(18,2) DEFAULT 0
)
-- Alter the temporary table to have a primary key of application number and program year.
ALTER TABLE #ACCOMPLISHMENTS
ADD CONSTRAINT PKCURSOR PRIMARY KEY (PROGRAM_YEAR, ACTIVITY_CODE)

DECLARE ACTIVITY_CURSOR CURSOR FOR
SELECT dbo.ACTIVITY_CODE.activity_code
FROM dbo.ACTIVITY_CODE
WHERE
(dbo.ACTIVITY_CODE.activity_code LIKE "P%%")
and (dbo.ACTIVITY_CODE.activity_code <> "P01")
ORDER BY dbo.ACTIVITY_CODE.activity_code

ALTER TABLE #ACCOMPLISHMENTS
DROP CONSTRAINT PKCURSOR

Odpowiedzi:

2 dla odpowiedzi № 1

Może się to zdarzyć, ponieważ masz rozszerzenie primary key o tej samej nazwie już w tym samym schema. Aby dowiedzieć się, na której tabeli się znajduje, uruchom następujące zapytanie:

SELECT
DISTINCT
Constraint_Name AS [Constraint],
Table_Schema AS [Schema],
Table_Name AS [TableName]
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME = "PKCURSOR"

Rozwiązanie:

Dodaj poniższy kod, aby usunąć klucz, jeśli istnieje, umieść ten fragment po CREATE TABLE #ACCOMPLISHMENTS część procedury składowanej.

IF EXISTS(select * from sys.key_constraints
WHERE name ="PKCURSOR")
ALTER TABLE #ACCOMPLISHMENTS
DROP CONSTRAINT PKCURSOR