Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 pass table to clr stored procedure  [new]
mike909
Member

Откуда:
Сообщений: 662
Добрый день.

Еще один способ передачи таблицы в CLR-хранимую процедуру на C#
[SqlProcedure]
public static int STest([SqlFacet(MaxSize = -1)] SqlString stmt)
{
  using (SqlConnection con = new SqlConnection("context connection = true"))
  {
    con.Open();
    using (SqlCommand cmd = new SqlCommand(stmt.Value, con))
    {
      using (SqlDataReader dr = cmd.ExecuteReader())
      {
        SqlContext.Pipe.Send(dr);
      }
    }
  }

  return 0;
}


/*
CREATE ASSEMBLY [STest]
FROM '...\BlaBlaBla.dll'
WITH PERMISSION_SET = SAFE

GO

CREATE PROCEDURE [dbo].[STest] @stmt nvarchar(max)
WITH EXECUTE AS CALLER
AS EXTERNAL NAME [STest].[StoredProcedures].[STest]

GO
*/
declare @handle int
      , @stmt nvarchar(max)

-- Fake_овая таблица, исключительно для подавления выхлопа sp_cursoropen
declare @t table(val nvarchar)

insert into @t
exec sp_cursoropen @handle OUT, 'select @@version as [ver]', 2, 8193

set @stmt = 'exec sp_cursorfetch ' + cast(@handle as sysname) + ', 2, 0, 100000'

exec [dbo].[STest] @stmt

exec sp_cursorclose @handle


ver
Microsoft SQL Server 2016 (SP1-CU2) (KB4013106) - 13.0.4422.0 (X64)
Mar 6 2017 14:18:16
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows 10 Enterprise 6.3 <X64> (Build 14393: ) (Hypervisor)
30 ноя 17, 09:31    [20994315]     Ответить | Цитировать Сообщить модератору
 Re: pass table to clr stored procedure  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Чем не подошли временные таблицы ?
30 ноя 17, 10:37    [20994519]     Ответить | Цитировать Сообщить модератору
 Re: pass table to clr stored procedure  [new]
mike909
Member

Откуда:
Сообщений: 662
Еще один способ ...
А так же XML; StageTable и т.д. и т.п. ...
30 ноя 17, 10:58    [20994571]     Ответить | Цитировать Сообщить модератору
 Re: pass table to clr stored procedure  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Что такое StageTable?
30 ноя 17, 11:00    [20994581]     Ответить | Цитировать Сообщить модератору
 Re: pass table to clr stored procedure  [new]
mike909
Member

Откуда:
Сообщений: 662
Cammomile,

Тоже что и временная, только обычная, про которую "знает" CLR-SP.
Свои записи CLR-SP получает select_ом по переданному ей ключу ...

PS. Наилучшим способом передачи "таблицы" является временные таблицы. Один минус - их надо предварительно заполнить ...
Ну и конечно, не глобальные времянки видны только в контекстном соединении -> не доступны асинхронные операции; MARS;
Впрочем, с курсором те же яйки (только в профиль).
30 ноя 17, 11:21    [20994663]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить