Передача массива параметров к хранимой процедуре

Ваш фабричный метод должен быть статическим и находиться в публичном классе.

Следующие работы для меня:

[assembly: XmlnsDefinition("http://schemas.Demo", "MyNameSpace")]

namespace MyNameSpace
{
    public interface IMyInterface
    {
        string MyProperty { get; set; }
    }

    internal class MyClass : IMyInterface
    {
        public string MyProperty { get; set; }
    }

    public static class MyClassFactory
    {
        public static IMyInterface Create()
        {
            return new MyClass();
        }
    }

    public class TestClass
    {
        public static void Test()
        {
            var myInterface = XamlServices.Parse(@"<IMyInterface xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns=""http://schemas.Demo"" 
    x:FactoryMethod=""MyClassFactory.Create"" 
    MyProperty=""MyValue""/>") as IMyInterface;
            Debug.Assert(myInterface != null);
        }
    }
}
74
задан marc_s 19 June 2012 в 09:19
поделиться

7 ответов

Используйте хранимую процедуру:

РЕДАКТИРОВАТЬ: Дополнение для сериализации List (или чего-либо еще):

List<string> testList = new List<int>();

testList.Add(1);
testList.Add(2);
testList.Add(3);

XmlSerializer xs = new XmlSerializer(typeof(List<int>));
MemoryStream ms = new MemoryStream();
xs.Serialize(ms, testList);

string resultXML = UTF8Encoding.UTF8.GetString(ms.ToArray());

Результат (готов к использованию с параметром XML):

<?xml version="1.0"?>
<ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <int>1</int>
  <int>2</int>
  <int>3</int>
</ArrayOfInt>

ORIGINAL POST:

Передача XML в качестве параметра:

<ids>
    <id>1</id>
    <id>2</id>
</ids>

CREATE PROCEDURE [dbo].[DeleteAllData]
(
    @XMLDoc XML
)
AS
BEGIN

DECLARE @handle INT

EXEC sp_xml_preparedocument @handle OUTPUT, @XMLDoc

DELETE FROM
    YOURTABLE
WHERE
    YOUR_ID_COLUMN NOT IN (
        SELECT * FROM OPENXML (@handle, '/ids/id') WITH (id INT '.') 
    )
EXEC sp_xml_removedocument @handle

43
ответ дан 24 November 2019 в 11:58
поделиться

Вы могли использовать функцию STRING_SPLIT в SQL Server. Можно проверить документацию здесь .

DECLARE @YourListOfIds VARCHAR(1000) -- Or VARCHAR(MAX) depending on what you need

SET @YourListOfIds = '1,2,3,4,5,6,7,8'

SELECT * FROM YourTable
WHERE Id IN(SELECT CAST(Value AS INT) FROM STRING_SPLIT(@YourListOfIds, ','))
0
ответ дан 24 November 2019 в 11:58
поделиться

это лучший источник:

http://www.sommarskog.se/arrays-in-sql.html

создайте функцию разделения, используя ссылку и используйте ее так:

DELETE YourTable
    FROM YourTable                           d
    LEFT OUTER JOIN dbo.splitFunction(@Parameter) s ON d.ID=s.Value
    WHERE s.Value IS NULL

Я предпочитаю подход с использованием таблицы номеров

Это код, основанный на приведенной выше ссылке, которая должна сделать это за вас ...

Перед тем, как использовать мою функцию, вам необходимо установить до «вспомогательной» таблицы, вам нужно сделать это только один раз для каждой базы данных:

CREATE TABLE Numbers
(Number int  NOT NULL,
    CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
DECLARE @x int
SET @x=0
WHILE @x<8000
BEGIN
    SET @x=@x+1
    INSERT INTO Numbers VALUES (@x)
END

используйте эту функцию для разделения вашей строки, которая не имеет цикла и выполняется очень быстро:

CREATE FUNCTION [dbo].[FN_ListToTable]
(
     @SplitOn              char(1)              --REQUIRED, the character to split the @List string on
    ,@List                 varchar(8000)        --REQUIRED, the list to split apart
)
RETURNS
@ParsedList table
(
    ListValue varchar(500)
)
AS
BEGIN

/**
Takes the given @List string and splits it apart based on the given @SplitOn character.
A table is returned, one row per split item, with a column name "ListValue".
This function workes for fixed or variable lenght items.
Empty and null items will not be included in the results set.


Returns a table, one row per item in the list, with a column name "ListValue"

EXAMPLE:
----------
SELECT * FROM dbo.FN_ListToTable(',','1,12,123,1234,54321,6,A,*,|||,,,,B')

    returns:
        ListValue  
        -----------
        1
        12
        123
        1234
        54321
        6
        A
        *
        |||
        B

        (10 row(s) affected)

**/



----------------
--SINGLE QUERY-- --this will not return empty rows
----------------
INSERT INTO @ParsedList
        (ListValue)
    SELECT
        ListValue
        FROM (SELECT
                  LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
                  FROM (
                           SELECT @SplitOn + @List + @SplitOn AS List2
                       ) AS dt
                      INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                  WHERE SUBSTRING(List2, number, 1) = @SplitOn
             ) dt2
        WHERE ListValue IS NOT NULL AND ListValue!=''



RETURN

END --Function FN_ListToTable

вы можете использовать эту функцию как таблицу в соединение:

SELECT
    Col1, COl2, Col3...
    FROM  YourTable
        INNER JOIN dbo.FN_ListToTable(',',@YourString) s ON  YourTable.ID = s.ListValue

вот ваше удаление:

DELETE YourTable
    FROM YourTable                                d
    LEFT OUTER JOIN dbo.FN_ListToTable(',',@Parameter) s ON d.ID=s.ListValue
    WHERE s.ListValue IS NULL
20
ответ дан 24 November 2019 в 11:58
поделиться

А как насчет использования типа данных XML вместо передача массива. Я считаю, что это лучшее решение, и оно хорошо работает в SQL 2005

0
ответ дан 24 November 2019 в 11:58
поделиться

Вы можете использовать временную таблицу, существование которой ожидает хранимая процедура. Это будет работать в более старых версиях SQL Server, которые не поддерживают XML и т. Д.

CREATE TABLE #temp
(INT myid)
GO
CREATE PROC myproc
AS
BEGIN
    DELETE YourTable
    FROM YourTable                    
    LEFT OUTER JOIN #temp T ON T.myid=s.id
    WHERE s.id IS NULL
END
3
ответ дан 24 November 2019 в 11:58
поделиться

Я бы подумал о передаче ваших идентификаторов в виде строки XML,а затем вы можете разрезать XML во временную таблицу для объединения или напрямую запросить XML, используя SP_XML_PREPAREDOCUMENT и OPENXML .

1
ответ дан 24 November 2019 в 11:58
поделиться

You could try this:



DECLARE @List VARCHAR(MAX)

SELECT @List = '1,2,3,4,5,6,7,8'

EXEC(
'DELETE
FROM TABLE
WHERE ID NOT IN (' + @List + ')'
)

12
ответ дан 24 November 2019 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: