Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для borro
37 / 5 / 3
Регистрация: 30.11.2011
Сообщений: 538

Почему возникает ошибка о том, что я второй раз создаю таблицу

28.01.2025, 13:24. Показов 1657. Ответов 11

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть код:
Кликните здесь для просмотра всего текста
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
DECLARE @C_Subscrs              VARCHAR(MAX) = ''
, @C_Consumers              VARCHAR(MAX) = ''
, @C_Contract_Number        VARCHAR(255) = ''
, @B_Debug BIT = 0
, @Date0 DATE = GETDATE()
, @Date1 DATE = GETDATE()
, @B_TSO BIT = 0
 
BEGIN  
    IF OBJECT_ID ('tempdb.dbo.#RPT_Partners') IS NOT NULL DROP TABLE #RPT_Partners
    CREATE TABLE #RPT_Partners (
        F_Partners  UNIQUEIDENTIFIER
    )
    CREATE CLUSTERED INDEX IDX_RPT_Partners ON #RPT_Partners (F_Partners)
    
    DECLARE @B_Partners_Filter BIT  = 1             
    INSERT #RPT_Partners (F_Partners)
    SELECT cp.LINK
    FROM dbo.CD_Partners AS cp
    INNER JOIN dbo.SF_Text_To_GuidTable(@C_Consumers) AS t
        ON t.LINK                   = cp.LINK
    WHERE   @C_Consumers            <> N'0'
        AND (cp.C_Name3             = @C_Contract_Number OR @C_Contract_Number  IS NULL)
        
    UNION ALL
            SELECT cp.LINK
    FROM dbo.CD_Partners AS cp
    WHERE   @C_Consumers            = N'0'
        AND cp.C_Name3              = @C_Contract_Number
        
    IF @@ROWCOUNT = 0 SET @B_Partners_Filter = 0 
        
    IF @B_Debug = 1
        SELECT '#RPT_Partners' AS [#RPT_Partners], * FROM #RPT_Partners
 
END
 
BEGIN  
    IF OBJECT_ID ('tempdb.dbo.#RPT_Subscr') IS NOT NULL DROP TABLE #RPT_Subscr
    CREATE TABLE #RPT_Subscr (
        F_Division      TINYINT,
        F_Subscr        INT,
        N_Period        INT
    )
    CREATE CLUSTERED INDEX IDX_RPT_Subscr ON #RPT_Subscr (F_Division, F_Subscr)
    
    INSERT #RPT_Subscr (F_Division, F_Subscr, N_Period)
    SELECT ss.F_Division, ss.LINK, NULL
    FROM #RPT_Partners cp
        INNER JOIN dbo.SD_Subscr AS ss
            ON ss.F_Partners    = cp.F_Partners
        INNER JOIN #RPT_Divisions AS d
            ON d.F_Division     = ss.F_Division
            AND d.F_SubDivision = ss.F_SubDivision
        INNER JOIN dbo.SF_Text_To_Table(@C_Subscrs) AS t
            ON t.LINK           = ss.LINK
    WHERE   @C_Subscrs          <> N'0'
        AND @B_Partners_Filter  = 1
        AND ss.B_EE             = 1
        AND (SS.D_Date_End >= @Date0 OR SS.D_Date_End IS NULL)
        AND SS.D_Date_Begin <= @Date1
    UNION ALL
    
    SELECT ss.F_Division, ss.LINK, NULL
    FROM #RPT_Partners cp
        INNER JOIN dbo.SD_Subscr AS ss
            ON ss.F_Partners    = cp.F_Partners
        INNER JOIN #RPT_Divisions AS d
            ON d.F_Division     = ss.F_Division
            AND d.F_SubDivision = ss.F_SubDivision
    WHERE   @C_Subscrs          = N'0'
        AND @B_Partners_Filter  = 1
        AND ss.B_EE             = 1
        AND (SS.D_Date_End >= @Date0 OR SS.D_Date_End IS NULL)
        AND SS.D_Date_Begin <= @Date1
    UNION ALL
        
    SELECT ss.F_Division, ss.LINK, NULL
    FROM dbo.SD_Subscr AS ss
        INNER JOIN #RPT_Divisions AS d
            ON d.F_Division     = ss.F_Division
            AND d.F_SubDivision = ss.F_SubDivision
        INNER JOIN dbo.SF_Text_To_Table(@C_Subscrs) AS t
            ON t.LINK           = ss.LINK
    WHERE   @C_Subscrs          <> N'0'
        AND @B_Partners_Filter  = 0
        AND ss.B_EE             = 1
        AND (SS.D_Date_End >= @Date0 OR SS.D_Date_End IS NULL)
        AND SS.D_Date_Begin <= @Date1
    UNION ALL
            
    SELECT ss.F_Division, ss.LINK, NULL
    FROM dbo.SD_Subscr AS ss
        INNER JOIN #RPT_Divisions AS d
            ON d.F_Division     = ss.F_Division
            AND d.F_SubDivision = ss.F_SubDivision
    WHERE   @C_Subscrs          = N'0'
        AND @B_Partners_Filter  = 0 
        AND ss.B_EE             = 1
        AND (SS.D_Date_End >= @Date0 OR SS.D_Date_End IS NULL)
        AND SS.D_Date_Begin <= @Date1
    OPTION(RECOMPILE)
        
    IF @B_TSO = 1
        DELETE RS
        FROM #RPT_Subscr AS rs
        CROSS APPLY (
                SELECT TOP 1 
                    ISNULL(ssh.F_Partners       , ss.F_Partners)        AS F_Partners
                FROM dbo.SD_Subscr AS ss
                    LEFT JOIN dbo.SD_Subscr_History AS ssh
                        ON      ssh.F_Subscr        = ss.LINK
                            AND ssh.F_Division      = ss.F_Division
                            AND ssh.D_Date          <= @Date1
                WHERE   ss.F_Division               = rs.F_Division
                    AND ss.LINK                     = rs.F_Subscr
                ORDER BY ssh.D_Date DESC
            ) AS ss
            INNER JOIN dbo.CD_Partners AS cp
                ON cp.LINK          = ss.F_Partners
            LEFT JOIN dbo.CS_Partner_Roles AS cpr
                ON  cpr.N_Bit_Number_2Power & cp.N_Partner_Roles 
                                            = cp.N_Partner_Roles
                AND cpr.C_Const     IN ('CSP_TSO', 'CSP_TSO_Cost')
        WHERE cpr.LINK  IS NULL
        
    IF @B_Debug = 1
        SELECT '#RPT_Subscr' AS [#RPT_Subscr]* FROM #RPT_Subscr
 
END 
    
BEGIN
    IF OBJECT_ID ('tempdb.dbo.#RPT_Subscr') IS NULL 
    BEGIN
        CREATE TABLE #RPT_Subscr (
            F_Division      TINYINT,
            F_Subscr        INT,
            N_Period        INT
        )
        CREATE CLUSTERED INDEX IDX_RPT_Subscr ON #RPT_Subscr (F_Division, F_Subscr)
        SET @B_IsSubscr_Filter = 0
    END
 
    IF OBJECT_ID ('tempdb.dbo.#RPT_Supplier') IS NULL 
    BEGIN
        CREATE TABLE #RPT_Supplier
        (
            F_Supplier  UNIQUEIDENTIFIER
        )
        CREATE CLUSTERED INDEX IDX_RPT_Supplier ON #RPT_Supplier (F_Supplier)
 
        INSERT INTO #RPT_Supplier
        (
            F_Supplier
        )
        SELECT '00000000-0000-0000-0000-000000000000' AS F_Supplier
    END
     
    IF OBJECT_ID ('tempdb.dbo.#ORL_RV_Network_List') IS NULL 
    BEGIN
        CREATE TABLE #ORL_RV_Network_List
        (
            F_Networks      UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED
        )
 
        EXEC dbo.ORL_RV_Network_List_Prc
            @C_Networks     = '00000000-0000-0000-0000-000000000000'
    END 
 
    IF OBJECT_ID('tempdb.dbo.#FS_Sale_Item') IS NULL 
    BEGIN
        CREATE TABLE #FS_Sale_Item
        (
            F_Sale_Item     INT PRIMARY KEY CLUSTERED
        )
 
        INSERT #FS_Sale_Item (
            F_Sale_Item )
        SELECT
            fsi.LINK
        FROM dbo.FS_Sale_Items AS fsi
    END
     
    IF OBJECT_ID('tempdb.dbo.#ES_Balance_Types') IS NULL 
    BEGIN
        CREATE TABLE #ES_Balance_Types
        (
            F_Balance_Types     INT PRIMARY KEY CLUSTERED,
            C_Short_Name        VARCHAR(50)
        )
 
        INSERT #ES_Balance_Types (
            F_Balance_Types, C_Short_Name)
        SELECT
            ebt.LINK, ebt.C_Short_Name
        FROM dbo.ES_Balance_Types AS ebt
    END
     
    IF OBJECT_ID('tempdb.dbo.#ES_Balance_Type_Details') IS NULL 
    BEGIN
        CREATE TABLE #ES_Balance_Type_Details
        (
            F_Balance_Type_Details  INT PRIMARY KEY CLUSTERED,
            C_Name                  VARCHAR(50)
        )
 
        INSERT #ES_Balance_Type_Details (
            F_Balance_Type_Details, C_Name )
        SELECT
            ebtd.LINK, ebtd.C_Name
        FROM dbo.ES_Balance_Type_Details AS ebtd
    END
         
    IF OBJECT_ID('tempdb.dbo.#ES_Network_Pts_Types') IS NULL 
    BEGIN
        CREATE TABLE #ES_Network_Pts_Types
        (
            F_Network_Pts_Types INT PRIMARY KEY CLUSTERED,
            C_Name                  VARCHAR(50)
        )
 
        INSERT #ES_Network_Pts_Types (
            F_Network_Pts_Types, C_Name )
        SELECT
            enit.LINK, enit.C_Name
        FROM dbo.ES_Network_Pts_Types AS enit
    END
     
END

запуск которого приводит к ошибке:
В базе данных уже существует объект с именем "#RPT_Subscr".
в блоке:
T-SQL
1
2
3
4
5
6
7
8
9
10
IF OBJECT_ID ('tempdb.dbo.#RPT_Subscr') IS NULL 
    BEGIN
        CREATE TABLE #RPT_Subscr (
            F_Division      TINYINT,
            F_Subscr        INT,
            N_Period        INT
        )
        CREATE CLUSTERED INDEX IDX_RPT_Subscr ON #RPT_Subscr (F_Division, F_Subscr)
        SET @B_IsSubscr_Filter = 0
    END
, который только в случае отсутствия таблицы #RPT_Subscr должен её создавать.
Но компилятор почему-то считает, что я в этом блоке непременно попытаюсь создать таблицу второй раз не смотря на проверку условия отсутствия таблицы.
Почему такое происходит и как правильно исправлять подобные ошибки?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.01.2025, 13:24
Ответы с готовыми решениями:

Почему возникает ошибка при индексации столбца в таблице mysql?
Всем привет, решил проиндексировать столбец в таблице содержащей более 50 000 000 записей. Поле VarChar(15). Написал такой запрос...

Почему возникает ошибка? Что не так?
Что здесь не так?

Почему возникает ошибка, или что сделано не правильно?
Я не знаю чего оно подчеркивает, то М, то і. Множества варианты перепробовала, но не получается Само задание: 1) построить...

11
74 / 18 / 6
Регистрация: 18.01.2025
Сообщений: 83
28.01.2025, 13:32
Надо проверку на существование таблицы по другому переписать: если таблица существует, то она удаляется перед созданием.
1
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
28.01.2025, 14:37
borro, если версия ядра позволяет, то рекомендую удалять вот так: Drop Table If Exists #RPT_Subscr;
Но я не удаляю временную таблицу, а просто создаю её без проверки. Её не должно быть, а, если это не так, то будет ошибка при попытке создания. Я считаю, что это правильнее, чем удалять "чью-то" унаследованную времянку без каких-либо ошибок.
1
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
28.01.2025, 14:47
Цитата Сообщение от Jack Famous Посмотреть сообщение
"чью-то" унаследованную времянку
такие времянки из других сессий не наследуются
1
1305 / 359 / 98
Регистрация: 14.10.2022
Сообщений: 1,098
28.01.2025, 15:21
Цитата Сообщение от Jack Famous Посмотреть сообщение
Но я не удаляю временную таблицу, а просто создаю её без проверки. Её не должно быть, а, если это не так, то будет ошибка при попытке создания. Я считаю, что это правильнее, чем удалять "чью-то" унаследованную времянку без каких-либо ошибок.
Более того - это антипаттерн программирования на TSQL.

Вот пример:

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Use testdb
Go
 
Create or alter proc b as
begin
    -- Эта строка лишняя и сточник ошибки
    Drop table if exists #t;
    -------------------------------------
    create table #t(b int)
    Insert into #t Values (2), (3)
    Select * from #t
end
go
 
Create or alter proc a as
begin
    Select 1 [a] into #t
    exec b
    Select * from #t
End
go
 
Exec a
go
Попробуйте с Drop table if exists #t; и без.
2
 Аватар для borro
37 / 5 / 3
Регистрация: 30.11.2011
Сообщений: 538
28.01.2025, 15:35  [ТС]
Спасибо всем за советы.
Но мне не надо удалять таблицу, а только проверить существует ли она, и если нет, то создать. Как тогда менять код?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.01.2025, 15:58
Цитата Сообщение от borro Посмотреть сообщение
Но мне не надо удалять таблицу, а только проверить существует ли она, и если нет, то создать. Как тогда менять код?
В данном случае никак. Потому что ошибка времени компиляции, а не выполнения
На момент компиляции кода таблица уже существует, отсюда и ошибка на create table
1
 Аватар для borro
37 / 5 / 3
Регистрация: 30.11.2011
Сообщений: 538
28.01.2025, 16:20  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
В данном случае никак. Потому что ошибка времени компиляции, а не выполнения
На момент компиляции кода таблица уже существует, отсюда и ошибка на create table
Неужели "выхода нет"?
0
74 / 18 / 6
Регистрация: 18.01.2025
Сообщений: 83
28.01.2025, 16:41
borro, а это все в процедуру завернуть нельзя? правда не факт, что это поможет. Надо наверное логику как-то пересматривать. Постановка задачи какая стоит в целом?
0
 Аватар для borro
37 / 5 / 3
Регистрация: 30.11.2011
Сообщений: 538
28.01.2025, 16:47  [ТС]
DeepSee, да, это будет внутри процедуры. Это уберет ошибку?
0
74 / 18 / 6
Регистрация: 18.01.2025
Сообщений: 83
28.01.2025, 16:51
Не знаю, надо смотреть весь код целиком. Я с телефона не могу сейчас это сделать, неудобно. Кто-то другой наверняка подскажет, прокомментирует.
0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
28.01.2025, 17:14
Цитата Сообщение от Аватар Посмотреть сообщение
такие времянки из других сессий не наследуются
какие это "такие"? С одной #? Из других сессий не наследуются, а внутри одной (в ХП1 создаётся #t, вызывается ХП2, которая видит #t) — запросто.

Цитата Сообщение от uaggster Посмотреть сообщение
Более того - это антипаттерн программирования на TSQL … Попробуйте с Drop table if exists #t; и без
соглашусь.
Я не знал, что создание временной таблицы с именем, как у наследуемой (я знаю, что реальное имя другое, но всё же) создаёт свой экземпляр временной таблицы, а не генерит ошибку … За это спасибо.

Получается, либо работаем с "переданной" из ХП1 в ХП2 видимой времянкой и она будет жить после окончания работы ХП2, либо создаём в ХП2 свою времянку, которая умрёт после окончания ХП2, в которой она была создана.

Цитата Сообщение от borro Посмотреть сообщение
Почему такое происходит и как правильно исправлять подобные ошибки?
почему вам рассказали, а что делать — просто убрать проверку на существование времянки.

UPD:
Прошу прощения — только увидел, что проверка и создание таблицы повторяется минимум в 2ух местах.
Выход обсуждался неоднократно: создать один раз безусловно (без проверок), а наполнять — по необходимости.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.01.2025, 17:14
Помогаю со студенческими работами здесь

Что ему надо, или почему возникает ошибка
Добрый день форумчане! int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { ...

Почему возникает и что значит ошибка LENGTH(X) must equal the length of Y in dim 2
Здравствуйте! Скажите, пожулуйста, почему возникает и что значит ошибка LENGTH(X) must equal the length of Y in dim 2. файл richardson.m ...

Не удаётся собрать. Ошибка возникает в том случае, когда хочу получить доступ для объектов классов & структур.
Не удаётся собрать. Ошибка возникает в том случае, когда хочу дать доступ к operator-&gt;() для объектов классов &amp; структур. IDE:...

почему возникает ошибка?
-------------------------------------------------------------------------------- Привет! Я писала программу для того, чтобы найти...

Почему возникает ошибка
Почему возникает ошибка?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru