2016-04-29 3 views
1

Этот блок кода не работает:Простой, если оператор не работает (сравнение строк)

DECLARE @CollationName varchar(50) 
set @CollationName = (
    select collation_name 
    from information_schema.columns 
    where table_name = 'MeteringPointPrice' and column_name = 'MeteringPointId' 
) 

if OBJECT_ID('tempdb..#MPLIST2') IS NOT NULL 
    drop table #MPLIST2 
if @CollationName = 'SQL_Danish_Pref_CP1_CI_AS' 
    create table #MPLIST2 (MeteringPointId varchar(18) COLLATE SQL_Danish_Pref_CP1_CI_AS) 
if @CollationName = 'Danish_Norwegian_CI_AS' 
    create table #MPLIST2(MeteringPointId varchar(18) COLLATE Danish_Norwegian_CI_AS) 

select @CollationName gives: Danish_Norwegian_CI_AS 

Но и если заявления выполняются так временной таблицы # MPLIST2 создается в 2 раза, что, конечно, дает ошибку ,

Я не могу понять, почему.

Вот код немного изменился:

DECLARE @CollationName varchar(50) 
set @CollationName = (
    select collation_name 
    from information_schema.columns 
    where table_name = 'MeteringPointPrice' and column_name = 'MeteringPointId' 
) 


if OBJECT_ID('tempdb..#MPLIST2') IS NOT NULL 
    drop table #MPLIST2 

if @CollationName = 'Danish_Norwegian_CI_AS' 
    begin 
     create table #MPLIST2 (MeteringPointId varchar(18) COLLATE Danish_Norwegian_CI_AS) 
    end 

if OBJECT_ID('tempdb..#MPLIST2') IS NULL 
    begin 
     select 'hellooo' 
     --create table #MPLIST2 (MeteringPointId varchar(18) COLLATE SQL_Danish_Pref_CP1_CI_AS) 
    end 

Эта часть выполняет успешно без 'Hellooo'. Но если я прокомментирую в строке «create table» ниже, то она даст ошибку «В базе данных уже есть объект с именем« # MPLIST2 ».»

+0

Тег используемого dbms. (Вдали от ANSI SQL ...) – jarlh

+0

Если уже есть вкладка e с этим именем, возможно, вы должны отказаться от него, прежде чем воссоздать его..) – schlonzo

+0

Jarlh, извините. Это tsql. –

ответ

1

Проблема возникает из-за того, что весь оператор скомпилирован в том же . время Таким образом, условие, которые создают существующую таблицу (например) вызывает ошибку Одним из решений является динамическим SQL, но это неаккуратно Другим просто использовать GO:..

DECLARE @CollationName varchar(50) 
set @CollationName = (
    select collation_name 
    from information_schema.columns 
    where table_name = 'MeteringPointPrice' and column_name = 'MeteringPointId' 
) 
GO 

if OBJECT_ID('tempdb..#MPLIST2') IS NOT NULL 
    drop table #MPLIST2 
GO 

if @CollationName = 'Danish_Norwegian_CI_AS' 
    begin 
     create table #MPLIST2 (MeteringPointId varchar(18) COLLATE Danish_Norwegian_CI_AS) 
    end; 
GO 

if OBJECT_ID('tempdb..#MPLIST2') IS NULL 
    begin 
     select 'hellooo' 
     --create table #MPLIST2 (MeteringPointId varchar(18) COLLATE SQL_Danish_Pref_CP1_CI_AS) 
    end 
GO 

Это создает отдельную партию транзакций в сценарий, который предотвращает ошибку.

Смежные вопросы