Добрый день.
Еще один способ передачи таблицы в CLR-хранимую процедуру на C#
Еще один способ передачи таблицы в 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)