Может быть, для этого сообщества моя проблема проста, но для меня (простого программиста на Java) это большая проблема.
У меня есть большая БД с большим и большим количеством данных. Итак, внешний администратор БД создал задание, которое покажет мне во временной таблице данные, которые мне нужны. Но он должен был создать таблицу без первичного ключа, и когда с моим проектом Java, чтобы прочитать эту таблицу, я получаю ошибку.
Я не могу прочитать эту таблицу, потому что первичный ключ не существует.
Можно ли вставить в процедуру возможность создания автоинкрементного первичного ключа без изменения структуры этой сложной процедуры?
Это начало кода хранимой процедуры:
USE [MYDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[spSchedula_Scadenzario]
as
begin
drop table MYDB.dbo.tmpTable
select
aa.*
into MYDB.dbo.tmpTable
from (...)
заранее спасибо
Некоторые альтернативы добавлению столбца автоинкремента с помощью
IDENTITY()
функции, предложенной @Shaneis :Создайте таблицу явно используя
CREATE TABLE
вместо использованияSELECT INTO
. Я очень предпочитаю этот метод, так как он дает вам полный контроль над создаваемой таблицей, такой как включение столбца автоинкремента и указание, что это будет Первичный ключ. Например:Если вы не можете изменить то, как / когда / где создается таблица, вы всегда можете добавить столбец позже, и при этом вам разрешается указать, что это будет
IDENTITY
столбец, и на нем создан первичный ключ. Например:Это работает даже в том случае, если в таблице уже есть данные: новый
IDENTITY
столбец будет заполнен, как ожидается, начиная со значения, указанного дляseed
параметра. Однако нет способа контролировать порядок, в котором присваиваются значения (что является одной из нескольких причин, по которым следует использовать вариант № 1, если это вообще возможно).Дополнительные замечания:
Вы уверены, что вам нужен первичный ключ, а не просто автоинкрементный / уникальный столбец? Хотя обычно желательно иметь первичный ключ, он не является ни обязательным, ни тем же, что и автоинкрементный столбец. Я спрашиваю только потому, что и заголовок, и текст этого Вопроса указывают на то, что вам нужен Первичный ключ, но в комментарии к ответу вы говорите, что приняли простой столбец автоинкремента.
Таблица, которую вы используете, на самом деле не является временной таблицей. Реальные временные таблицы имеют имена, начинающиеся с
#
или##
для глобальных временных таблиц. Используемая вами таблицаdbo.tmpTable
- это обычная постоянная таблица с префиксом «tmp», указывающая, что она, вероятно, предназначена только для этого процесса и не является частью модели данных.Если коду приложения не требуется доступ к этой «временной» таблице, и единственная ссылка на него находится внутри этой хранимой процедуры, то вы можете рассмотреть возможность ее изменения на настоящую временную таблицу, которая имеет преимущество в том, что ее очищают, когда процесс завершается, и в этом случае вам не нужно
DROP TABLE
утверждение.Если вы будете использовать постоянную таблицу вместо временной таблицы (в этом случае вам нужно будет очистить ее самостоятельно), то
DROP TABLE
оператор должен быть условным, чтобы он не выдавал ошибку, если таблица не существует:Вместо того, чтобы делать
SELECT *
, вы должны указать полный список столбцов. Использование*
повышает вероятность прерывания процесса при добавлении столбцов / полей к таблицам или подзапросам (дляaa
которых используется псевдоним).источник