2015-08-14 5 views
0

Есть ли способ связать массив, сгенерированный в C++, с параметром в SQL-Statement. Что-то вроде этого:Связывание массива с параметром sql

insert into Table1(COLUMN1, COLUMN2, COLUMN3, datum) values (:1,:2,:3,:4) 

в этом примере :1, :2, :3, :4 являются параметр массива.

Я знаю Таблица Variable очень хорошая идея, но я хотел бы использовать другой approache

+0

Других классические методов прохождение XML в качестве параметра, или составляют строку со значениями, с сепаратором, например, «1,2,3,4,5', а затем разбивая его на SQL-стороне – xanatos

+0

Но мне сложно, что вы можете вставить в таблицу 4 массива ... в SQL Server нет столбца массива типов – xanatos

+0

http://stackoverflow.com/questions/8898203/how-to-insert-array-elements-in-sql-connecting-with-c –

ответ

1

Используя предположение, данное Xantos, передать свой массив в хранимую процедуру в виде строки с разделителями. Затем вы можете использовать строку с разделителями в табличной функции.

ALTER FUNCTION [dbo].[String_To_Int_Table] 
(
     @list NVARCHAR(1024) 
     , @delimiter NCHAR(1) = ',' --Defaults to CSV 
) 
RETURNS 
    @tableList TABLE(
     value INT 
     ) 
AS 

BEGIN 
    DECLARE @value NVARCHAR(11) 
    DECLARE @position INT 

    SET @list = LTRIM(RTRIM(@list))+ ',' 
    SET @position = CHARINDEX(@delimiter, @list, 1) 

    IF REPLACE(@list, @delimiter, '') <> '' 
    BEGIN 
      WHILE @position > 0 
      BEGIN 
       SET @value = LTRIM(RTRIM(LEFT(@list, @position - 1))); 
       INSERT INTO @tableList (value) 
       VALUES (cast(@value as int)); 
       SET @list = RIGHT(@list, LEN(@list) - @position); 
       SET @position = CHARINDEX(@delimiter, @list, 1); 

      END 
    END 
    RETURN 
END 

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

-- check to see if contacts were included... 
    if len(ltrim(rtrim(@Contacts)))> 0 
    begin 
     --create a temp table to hold the list of ids 
     CREATE TABLE #TmpContacts (ID INT); 

     -- use the table valued function to parse the ids into a table. 
     INSERT INTO #TmpContacts(ID) 
     SELECT Value FROM dbo.String_to_int_table(@Contacts, ','); 

     -- Select the @InterfaceID and the parsed ContactTypeIDs 
     -- for a bulk insert into the relational table... 
     INSERT INTO [InterfaceContacts] 
      ([InterfaceID] 
      ,[ContactID] 
      ,[Created] 
      ,[CreatedBy]) 
     Select @InterfaceID, T.ID, CURRENT_TIMESTAMP, sUser_sName() 
     FROM #TmpContacts T; 

     drop table #TmpContacts; 
    end 
Смежные вопросы