Если не существует, вставьте запрос в базу данных - PullRequest
0 голосов
/ 17 марта 2020

У меня есть два следующих запроса: первый напрямую вставляется, а второй проверяет, существует ли запись в первую очередь, затем, если это произойдет, она прекратит вставку, если нет, то вставит.

Работает

query1 = "INSERT INTO dbo.SAP_Mat_StoreBGA (Material,MaterialDescr) 
          VALUES ('" + row["Material"] + "','" + row["MaterialDescr"] + "')";

Не работает

query1 = "IF NOT EXISTS (
   INSERT INTO dbo.SAP_Mat_StoreBGA (Material,MaterialDescr)" + " 
   VALUES ('" + row["Material"] + "','" + row["MaterialDescr"] + "')
)";

Пожалуйста, помогите мне заставить работать "не работающий" запрос.

Ответы [ 3 ]

0 голосов
/ 17 марта 2020

Неверный способ составления запроса. Это может привести к SQL инъекционным атакам. Я бы предложил вам использовать SqlParameter s.

string commandText = "IF NOT EXISTS(SELECT * FROM dbo.SAP_Mat_StoreBGA WHERE "
          + "Material = @Material " +
          + " AND MaterialDescription = @MaterialDescription)"
          + "BEGIN"
          + "INSERT INTO dbo.SAP_Mat_StoreBGA (Material,MaterialDescr) "
          + "VALUES (@Material ,@MaterialDescription)"
          + "END";
SqlCommand cmd = connection.CreateCommand();
cmd.CommandText = @commandText;
cmd.Parameters.Add("@Material", SqlDbType.Varchar,30).Value=row["Material"];
cmd.Parameters.Add("@MaterialDescription",SqlDbType.Varchar,255).Value=
                                                   row["MaterialDescr"];

В фоновом режиме он будет использовать sp_execute sql для выполнения параметризованного оператора.

exec sp_executesql N'IF NOT EXISTS(SELECT * FROM dbo.SAP_Mat_StoreBGA where 
Material = @Material 
BEGIN
AND MaterialDescription = @MaterialDescription)
INSERT INTO dbo.SAP_Mat_StoreBGA (Material,MaterialDescr) 
VALUES (@Material ,@MaterialDescription)
END', N'@Material VARCHAR(30),@MaterialDescription VARCHAR(255)',@Material='ABC' 
,@MaterialDescription='ABC Description'
0 голосов
/ 17 марта 2020

Вот, я сделал вам пример, надеюсь, это поможет, если не хотя бы, может быть, это приведет вас к ответам.

drop table #testMr
create table #testMr(val1 varchar (20),val2 numeric)

declare @param1 varchar(20)
declare @param2 numeric

set @param1='dog'
set @param2=10

--here it will insert that values if not exists
if(select count(*) from #testMr where val1=@param1 and val2=@param2)=0
begin
    insert into #testMr values(@param1,@param2)
end
select * from #testMr
set @param1='dog'
set @param2=10
--this is an example when it wont insert the values
if(select count(*) from #testMr where val1=@param1 and val2=@param2)=0
begin
    insert into #testMr values(@param1,@param2)
end
select * from #testMr
set @param1='cat'
set @param2=10
--and this is and example when it will insert because its a diferent values
if(select count(*) from #testMr where val1=@param1 and val2=@param2)=0
begin
    insert into #testMr values(@param1,@param2)
end
select * from #testMr
0 голосов
/ 17 марта 2020

Предполагается, что ваша таблица имеет идентификатор в качестве первичного ключа. Вы можете использовать приведенный ниже запрос SQL, чтобы проверить, существует ли запись с таким идентификатором.

Select count(*) from tableA where id = 'yourId'
...