Как сделать параметры необязательными в SQL

Мне нужна процедура wite, которая получает имя таблицы и список имен файлов для сравнения и далет все повторяющиеся строки, которые сравнивают этот файл

Как я могу получить список параметров - необязательно?

CREATE PROCEDURE DeleteDuplicateRows 
      @tableName NVARCHAR(MAX) not null,
      @nameFildes ???, 
AS
BEGIN

     DECLARE @sql NVARCHAR(MAX)

     set @sql = 'delete from '+@tableName+
            'where '+ ????
     EXEC sp_executesql @Sql


END

Примеры данных, желаемые результаты и объяснение логики действительно помогут.

Gordon Linoff 18.11.2018 13:13

Возможный дубликат дополнительные параметры в SQL Server хранятся proc?

Yann39 18.11.2018 13:18

И если у вас есть вопрос о передаче списка значений в качестве параметра, см. stackoverflow.com/questions/11102358/…

Yann39 18.11.2018 13:19

Это очень открыто для инъекций. Я никогда не рекомендую объединять подобные строки для создания динамического SQL. Тем более, что вы объявляете @TableName как nvarchar(MAX); это похоже на то, что вы просите укол и позволяете всем, кто делает это, делать все, что они хотят. По крайней мере, используйте соответствующий тип данных, например sysname или nvarchar(128), и укажите имя объекта, используя QUOTENAME.

Larnu 18.11.2018 13:23

Лично я бы посоветовал сообщить нам, чего вы на самом деле пытаетесь достичь, чтобы мы могли помочь вам остановить гигантскую дыру в безопасности, которая у вас есть прямо сейчас.

Larnu 18.11.2018 13:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вы ищете способ передать несколько значений; то есть вы можете дать ноль для многих имен полей. Для этого вместо того, чтобы смотреть на параметр option, вам лучше передать «массив», который может иметь нулевую или большую длину. Для этого вы можете объявить свой собственный тип, представляющий таблицу, содержащую один столбец символов nvarchar, например, ниже:

create type StringArrayType as table   
(
    value nvarchar(max) not null
)  
go
create procedure DeleteDuplicateRows 
      @tableName NVARCHAR(MAX),
      @fieldNames StringArrayType readonly
AS
begin

     DECLARE @sql NVARCHAR(MAX)

     select @sql = coalesce(@sql + ', ', '') + quotename(value)
     from @fieldNames

     --this deletes all values of any row with duplicates (i.e. including the original)
     --To only delete the duplicates and not the original, look at using row_number() or similar 
     --(many examples exist on SO already, and that's not what you've asked about, so I'll only provide this version for this example)
     set @sql = 'delete from ' + quotename(@tableName) + coalesce(' group by ' + @sql + ' having count(1) > 1','')

     select @sql SqlStatement --for now just return the SQL
     --EXEC sp_executesql @Sql

end
go
declare @fields StringArrayType;

insert @fields (value) values ('One'),('Two');

exec DeleteDuplicateRows 'myTable', @fields;

Скрипку этого кода можно найти здесь: https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=477266854bcefc73286868e27c882ee9

Если вы не хотите указывать какие-либо поля, просто пропустите оператор insert @fields (value) values ('One'),('Two');; т.е. переход в пустую таблицу.

Я хочу удалить все строки, но живу в одну строку, а не удалять все строки

Ayal 18.11.2018 13:40

@Ayal, как упоминалось в комментариях, есть разные способы сделать это. E, g, stackoverflow.com/questions/18932/…, stackoverflow.com/questions/15053693/…. Однако ваш вопрос касался того, как передать имена столбцов, поэтому я попытался ответить только на эту часть в этом ответе.

JohnLBevan 18.11.2018 13:42

Я не хочу удалять все строки, я хочу удалить все строки -1, что означает, оставляя одну строку всех дубликатов

Ayal 18.11.2018 13:55

Вышеупомянутые ссылки не помогают / не делают то, что вам нужно?

JohnLBevan 18.11.2018 13:57
Ответ принят как подходящий

Я создаю эту процедуру, которая удаляет повторяющиеся строки, но оставляет одну

`CREATE PROCEDURE [dbo].[DeleteDuplicateRows] 
 @TableName NVARCHAR(MAX) ,
 @FildesName NVARCHAR(MAX) 
 AS
 BEGIN

    DECLARE @sql NVARCHAR(MAX)

    set @sql='DELETE FROM '+@TableName +' WHERE Id IN (
    SELECT Id FROM (
        SELECT 
        Id
        ,ROW_NUMBER() OVER (PARTITION BY '+ @FildesName +' ORDER BY Id) AS [ItemNumber]
    FROM '+@TableName +
') a WHERE ItemNumber > 1 )'

EXEC sp_executesql @sql

END`

В @TableName - название таблицы. в @FildesName - Ключевые поля для двойной строки

Другие вопросы по теме