Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
ALTO_MAN
Member

Откуда:
Сообщений: 13
Имеется CLR сборочка:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Text;

public class UserDefinedFunctions 
	{
	[SqlFunction()]
	
	public static SqlByte DirPresent(SqlString DirName)
		{
		if (System.IO.Directory.Exists(DirName.ToString()))
		{
			LOGTxt(@"c:\clr.log", @"DirPresent=20");
			return 20;
		}
		else
		{
			LOGTxt(@"c:\clr.log", @"DirPresent=10");
			return 10;
		}
		}
	
	public static SqlByte NewDir(SqlString DirName)
		{
		System.IO.Directory.CreateDirectory(DirName.ToString());
		LOGTxt(@"c:\clr.log", @"NewDir");
		return 1;
		}
	
	public static SqlByte DirIsEmpty(SqlString DirName)
		{
		string [] FileEntries = System.IO.Directory.GetFiles(DirName.ToString());
		if (FileEntries.Length>0)
			return 0;
		else
			return 1;
		}	
	
	public static SqlByte RemoveDir(SqlString DirName)
		{
		System.IO.Directory.Delete(DirName.ToString());
		return 1;
		}	
	
	public static SqlByte FilePresent(SqlString FilePath)
		{
		if (System.IO.File.Exists(FilePath.ToString()))
			return 1;
		else
			return 0;
		}	
	
	/// Функция читает содержимое файла в блоб. Пример вызова:
	/// select cast(dbo.LoadBLOBFromFile('c:\Demo\FILESTREAM_импорт-экспорт файла.txt') as varchar(max))
  	public static SqlBytes LoadBLOBFromFile(SqlString fileName)
   	{
      FileStream fs= new FileStream(fileName.ToString(), FileMode.Open);
      SqlBytes blob= new SqlBytes(new byte[fs.Length]);
      CopyBytesBetweenStreams(fs, blob.Stream);
      fs.Close(); 
      return blob;
    	}
 
    /// Процедура пишет в файл содержимое блоба. Пример вызова:
    /// declare @x varbinary(max)
    /// set @x = dbo.LoadBLOBFromFile('c:\Demo\FILESTREAM_импорт-экспорт файла.txt')
    /// exec SaveBLOBToFile @x, 'c:\Demo\FILESTREAM_импорт-экспорт файла1.txt'
	public static SqlByte SaveBLOBToFile(SqlBytes blob, SqlString fileName)
   	{
      FileStream fs= new FileStream(fileName.ToString(), FileMode.OpenOrCreate);
      CopyBytesBetweenStreams(blob.Stream, fs);
      fs.Close();
		return 1;
    	}
	
	public static SqlByte RemoveFile(SqlString FilePath)
		{
		System.IO.File.Delete(FilePath.ToString());
		return 1;
		}	
	
	public static SqlByte xLOG(SqlString FilePath, SqlString LogText)
		{
		LOGTxt(FilePath.Value, LogText.Value);
		return 1;
		}	
	
	private static void LOGTxt(String file_path, String log_text)
   	{
		FileStream FS = new FileStream(file_path, FileMode.OpenOrCreate, FileAccess.Write);
 		StreamWriter SW = new StreamWriter(FS);
 		FS.Seek(0, SeekOrigin.End);
		SW.WriteLine(log_text);
		SW.Close();
		FS.Close();
		}
	
	private static void CopyBytesBetweenStreams(Stream sourceStream, Stream destStream)
   	{
      int bufLen= 100000;
      SqlBytes blob= new SqlBytes();
      byte[] buffer= new byte[bufLen];
      int count;
      for (; ; )
      	{
         count = sourceStream.Read(buffer, 0, bufLen);
         if (count == 0) 
         	break;
         destStream.Write(buffer, 0, count);           
			}
      destStream.Flush();
    	}
	} 

Прикручиваем её к базе так:
sp_configure 'clr enabled', 1
go
reconfigure
go

ALTER DATABASE GRYPHON SET TRUSTWORTHY ON

CREATE ASSEMBLY CLRFunctions FROM 'X:\Work\Now_Work\TCCLR\tcclr.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS 
go    

CREATE FUNCTION [dbo].DirPresentCLR(@dir [nvarchar](128))
RETURNS tinyint WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.DirPresent
go          

CREATE FUNCTION [dbo].NewDirCLR(@dir [nvarchar](128))
RETURNS tinyint WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.NewDir
go           

CREATE FUNCTION [dbo].DirIsEmptyCLR(@dir [nvarchar](128))
RETURNS tinyint WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.DirIsEmpty
go

CREATE FUNCTION [dbo].RemoveDirCLR(@dir [nvarchar](128))
RETURNS tinyint WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.RemoveDir
go

CREATE FUNCTION [dbo].FilePresentCLR(@fil [nvarchar](128))
RETURNS tinyint WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.FilePresent
go

CREATE FUNCTION [dbo].LoadBLOBFromFileCLR(@fil [nvarchar](128))
RETURNS [varbinary](max) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.LoadBLOBFromFile
go

CREATE FUNCTION [dbo].SaveBLOBToFileCLR(@img [varbinary](max), @fil [nvarchar](128))
RETURNS tinyint WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.SaveBLOBToFile
go        

CREATE FUNCTION [dbo].RemoveFileCLR(@fil [nvarchar](128))
RETURNS tinyint WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.RemoveFile
go        

CREATE FUNCTION [dbo].xLOGCLR(@fil [nvarchar](128), @log [nvarchar](128))
RETURNS tinyint WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.LOG
go

Выполняет ейные функции процедура:
CREATE PROCEDURE dbo.SAVE_IMAGE
(
    @DAT_INDX bigint,
    @CAM_ID int,
    @IMAGE varbinary(max)
)
AS
begin
declare 
	@ImageIndex bigint,
   @ImageDirPresent tinyint,
   @I tinyint,
   @ImageDir varchar(128), 
   @ImagePath varchar(128) 
set @I = dbo.xLOGCLR('c:\xcrt.log', '1') 
/*Узнаем номер вставляемого изображения*/ 
set @ImageIndex = IDENT_CURRENT ('T_IMAGE')
set @I = dbo.xLOGCLR('c:\xcrt.log', '2') 
set @ImageIndex = @ImageIndex+1
set @I = dbo.xLOGCLR('c:\xcrt.log', '3') 
set @ImageDirPresent = dbo.DirPresentCLR('C:\Program Files\TC\DataBase\IMAGES')
set @I = dbo.xLOGCLR('c:\xcrt.log', '4='+STR(@ImageDirPresent)) 
if (@ImageDirPresent=1) and not(@IMAGE is null)
	begin
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-1')    
   set @ImageDir = 'C:\Program Files\TC\DataBase\IMAGES\'+LTRIM (STR(@ImageIndex / 1000, 12))
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-2') 
	set @ImageDirPresent = dbo.DirPresentCLR(@ImageDir)
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-3') 
   if @ImageDirPresent = 0
   	set @I = dbo.NewDirCLR(@ImageDir)
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-4') 
   set @ImagePath = @ImageDir+'\'+LTRIM (STR(@ImageIndex, 12))+'.jpg'
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-5') 
   select @I = dbo.SaveBLOBToFileCLR(@IMAGE, @ImagePath)
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-6') 
   insert into T_IMAGE(F_DATA_NUM, F_CAM) values (@DAT_INDX, @CAM_ID)
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-7') 
   end
else
	begin
	set @I = dbo.xLOGCLR('c:\xcrt.log', '2-1') 
   insert into T_IMAGE(F_DATA_NUM, F_CAM, F_IMAGE) values (@DAT_INDX, @CAM_ID, @IMAGE)
	set @I = dbo.xLOGCLR('c:\xcrt.log', '2-2') 
   end
end

А вот и сам лог 'c:\xcrt.log':
"1
2
3
4= 10
1-1
1-2
1-3
1-4
1-5
1-6
1-7
2-1
2-2
1
2
3
4= 20
2-1
2-2
1
2
3
4= 20
2-1
2-2"

ВОПРОСы:
- Откуда берутся три запуска?????
- Почему в первом сервер начхал на все условные ветвления?????
12 авг 11, 16:26    [11111275]     Ответить | Цитировать Сообщить модератору
 Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Пока вижу много букаф :) но сразу косяки: где у вас в исходной сборке метод LOG в который мэппируется SQL-ф-ия xLOGCLR? у вас там только xLOG (и еще LOGTxt, но эта вообще приватная).
12 авг 11, 18:34    [11112182]     Ответить | Цитировать Сообщить модератору
 Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
ALTO_MAN
Member

Откуда:
Сообщений: 13
Конечно, xLOG. Описка... Скрипт подключения процедур не последняя версия(не подправленная), конечно правильная версия такая:
...
CREATE FUNCTION [dbo].xLOGCLR(@fil [nvarchar](128), @log [nvarchar](128))
RETURNS tinyint WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CLRFunctions.UserDefinedFunctions.xLOG
go
Именно этой функцией и наполняется из хранимой процедуры предоставленный лог файл.
13 авг 11, 01:31    [11113574]     Ответить | Цитировать Сообщить модератору
 Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Понятно. Судя по всему эта описка не единственная да и вообще алгоритмическая составляющая кода вызывает много вопросов и еще больше раздражения. К примеру:

1. Нахрена DirPresent возвращает 10/20 если дир - он либо есть либо его нет? Почему не возвращать -798/12^68? Ну так, чисто что б жизнь малиной не казалась.
2. Если уж он возвращает 10/20 - нахрена в CREATE PROCEDURE dbo.SAVE_IMAGE сравнивать этот резалт с 1?
set @ImageDirPresent = dbo.DirPresentCLR('C:\Program Files\TC\DataBase\IMAGES')
...
if (@ImageDirPresent=1) and not(@IMAGE is null)
...
Ясно же что false.
3. Наконец, с учетом п.2, нахрена в dbo.SAVE_IMAGE выполнение (судя по приведенному логу c:\xcrt.log) вообще уходит на ветку set @I = dbo.xLOGCLR('c:\xcrt.log', '1-1') если if, как только что выяснили, всегда дает false?
4. И совсем наконец - просто не показан код вызова dbo.SAVE_IMAGE. Может она коллится тригерром (-ами)?
13 авг 11, 12:47    [11114010]     Ответить | Цитировать Сообщить модератору
 Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
ALTO_MAN
Member

Откуда:
Сообщений: 13
SamMan
Понятно. Судя по всему эта описка не единственная да и вообще алгоритмическая составляющая кода вызывает много вопросов и еще больше раздражения. К примеру:

1. Нахрена DirPresent возвращает 10/20 если дир - он либо есть либо его нет? Почему не возвращать -798/12^68? Ну так, чисто что б жизнь малиной не казалась.
2. Если уж он возвращает 10/20 - нахрена в CREATE PROCEDURE dbo.SAVE_IMAGE сравнивать этот резалт с 1?
set @ImageDirPresent = dbo.DirPresentCLR('C:\Program Files\TC\DataBase\IMAGES')
...
if (@ImageDirPresent=1) and not(@IMAGE is null)
...
Ясно же что false.
3. Наконец, с учетом п.2, нахрена в dbo.SAVE_IMAGE выполнение (судя по приведенному логу c:\xcrt.log) вообще уходит на ветку set @I = dbo.xLOGCLR('c:\xcrt.log', '1-1') если if, как только что выяснили, всегда дает false?
4. И совсем наконец - просто не показан код вызова dbo.SAVE_IMAGE. Может она коллится тригерром (-ами)?


Ответы:
1. Пост был написан после многочисленных экспериментов с кодом (первоначально функция возвращала 1 или 0), хотел проверить доходит ли ответ от CLR функции до сервера (думал что какое-то несоответствие типов параметров).
2. Этим первоначально проверятся входит ли сервер в первый после проверки блок begin ... end. Оказалось что все равно заходит. Условия побоку, хоть оно и ЛОЖЬ.
3. См. пункт 2.
4. Триггер на эту таблицу есть но он "ПОСЛЕ УДАЛЕНИЯ" работает. Вызывал и "execute dbo.SAVE_IMAGE 1, 2, null" и "exec dbo.SAVE_IMAGE 1, 2, null", даже с бинарными данными запускал вместо null суть не меняется - ПЕРВЫЙ ЗАПУСК ВЫПОЛНЯЕТ ВСЁ ТАК, КАК БУДТО НИКАКИХ УСЛОВИЙ НЕТ ВОВСЕ (см. в лог).
ПОЧЕМУ? И откуда еще два раза выполняется? Проверял на ошибки (вставлял в процедуру BEGIN TRY ... END TRY и BEGIN CATCH ... END CATCH), ошибок не было. Т. е. ошибка не могла вызвать перезапуск процедуры (если такой вообще выполняется).
13 авг 11, 21:57    [11115109]     Ответить | Цитировать Сообщить модератору
 Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
ALTO_MAN
Member

Откуда:
Сообщений: 13
Добавлю еще. Проводился такой эксперимент код менялся примерно так:
CREATE PROCEDURE dbo.SAVE_IMAGE
(
    @DAT_INDX bigint,
    @CAM_ID int,
    @IMAGE varbinary(max)
)
AS
begin
declare 
	@ImageIndex bigint,
   @ImageDirPresent tinyint,
   @I tinyint,
   @ImageDir varchar(128), 
   @ImagePath varchar(128) 
set @I = dbo.xLOGCLR('c:\xcrt.log', '1') 
/*Узнаем номер вставляемого изображения*/ 
set @ImageIndex = IDENT_CURRENT ('T_IMAGE')
set @I = dbo.xLOGCLR('c:\xcrt.log', '2') 
set @ImageIndex = @ImageIndex+1
set @I = dbo.xLOGCLR('c:\xcrt.log', '3') 
set @ImageDirPresent = dbo.DirPresentCLR('C:\Program Files\TC\DataBase\IMAGES')
set @I = dbo.xLOGCLR('c:\xcrt.log', '4='+STR(@ImageDirPresent)) 
if (@ImageDirPresent=1) and not(@IMAGE is null)
	begin
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-1')    
   set @ImageDir = 'C:\Program Files\TC\DataBase\IMAGES\'+LTRIM (STR(@ImageIndex / 1000, 12))
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-2') 
	set @ImageDirPresent = dbo.DirPresentCLR(@ImageDir)
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-3') 
   if @ImageDirPresent = 0
        begin
        set @I = dbo.xLOGCLR('c:\xcrt.log', 'NewDirCLR') 
   	set @I = dbo.NewDirCLR(@ImageDir)
        end
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-4') 
   set @ImagePath = @ImageDir+'\'+LTRIM (STR(@ImageIndex, 12))+'.jpg'
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-5') 
   select @I = dbo.SaveBLOBToFileCLR(@IMAGE, @ImagePath)
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-6') 
   insert into T_IMAGE(F_DATA_NUM, F_CAM) values (@DAT_INDX, @CAM_ID)
	set @I = dbo.xLOGCLR('c:\xcrt.log', '1-7') 
   end
else
	begin
	set @I = dbo.xLOGCLR('c:\xcrt.log', '2-1') 
   insert into T_IMAGE(F_DATA_NUM, F_CAM, F_IMAGE) values (@DAT_INDX, @CAM_ID, @IMAGE)
	set @I = dbo.xLOGCLR('c:\xcrt.log', '2-2') 
   end
end

И в результате в логе было примерно такое:
"...
1-3
NewDirCLR
1-4
..."
Т. е. загадка образуется. "
set @ImageDirPresent = dbo.DirPresentCLR(@ImageDir)
" загоняет в @ImageDirPresent 10 (или даже 20), а условию "
if @ImageDirPresent = 0
" все равно. Оно как думается живое и выполняет код ни смотря на законы логики...

Стою тут в MsSQL обутый и не знаешь в чем дело...
13 авг 11, 22:10    [11115144]     Ответить | Цитировать Сообщить модератору
 Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
ALTO_MAN
Оказалось что все равно заходит. Условия побоку, хоть оно и ЛОЖЬ

Надеюсь хотя бы строчки в таблицах самопроизвольно не возникают еще?

Инструкция:

  • создать пустую базу
  • в ней - таблицу T_IMAGE соотв. структуры
  • создать сборку-функции-хр.проц. из первого поста исправив только явные косяки препятствующие компиляции (LOG->xLOG)
  • сделать так что бы фолдера тестируемого на присутствие фу-ией DirPresentCLR не было в наличии
    запустить:
    exec dbo.SAVE_IMAGE 1, 2, null
  • Получить:
    clr.log:
    DirPresent=10
    xcrt.log:
    1
    2
    3
    4=        10
    2-1
    2-2
    

    Тут что-то непонятное есть?
  • 14 авг 11, 10:12    [11116082]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    ALTO_MAN
    Member

    Откуда:
    Сообщений: 13
    Действия:
    1-3) Создаём БД:
    -- SQL Manager 2011 Lite for SQL Server 3.7.0.1
    -- ---------------------------------------
    -- Хост         : (local)
    -- База данных  : new_db
    -- Версия       : Microsoft SQL Server  10.0.1600.22
    
    
    --
    -- Definition for assembly CLRFunctions : 
    --
    
    CREATE ASSEMBLY [CLRFunctions]
    FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300E5B9484E0000000000000000E00002210B010800000C00000006000000000000FE2A0000002000000040000000004000002000000002000004000000000000000400000000000000008000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000B02A00004B000000004000009802000000000000000000000000000000000000006000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000040B000000200000000C000000020000000000000000000000000000200000602E72737263000000980200000040000000040000000E0000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001200000000000000000000000000004000004200000000000000000000000000000000E02A000000000000480000000200050018230000980700000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000133002005000000001000011000F00FE16030000016F0400000A280500000A16FE010B072D1A0072010000707217000070280A0000060017280600000A0A2B1A0072010000707231000070280A0000060016280600000A0A2B00062A133002002F00000002000011000F00FE16030000016F0400000A280700000A267201000070724B000070280A0000060017280600000A0A2B00062A00133002003500000003000011000F00FE16030000016F0400000A280800000A0A068E6916FE0216FE010C082D0916280600000A0B2B0917280600000A0B2B00072A000000133001001F00000002000011000F00FE16030000016F0400000A280900000A0017280600000A0A2B00062A00133002002E00000001000011000F00FE16030000016F0400000A280A00000A16FE010B072D0917280600000A0A2B0916280600000A0A2B00062A0000133003004100000004000011000F00FE16030000016F0400000A19730B00000A0A066F0C00000AD48D0E000001730D00000A0B06076F0E00000A280B00000600066F0F00000A00070C2B00082A000000133003003400000005000011000F01FE16030000016F0400000A1A730B00000A0A026F0E00000A06280B00000600066F0F00000A0017280600000A0B2B00072A133001001F00000002000011000F00FE16030000016F0400000A281000000A0017280600000A0A2B00062A00133002002000000002000011000F00281100000A0F01281100000A280A0000060017280600000A0A2B00062A13300400320000000600001100021A18731200000A0A06731300000A0B06166A186F1400000A2607036F1500000A00076F1600000A00066F0F00000A002A00001330040048000000070000110020A08601000A731700000A0B068D0E0000010C2B2500020816066F1800000A0D0916FE0116FE01130411042D022B10030816096F1900000A00001713042BD6036F1A00000A002A1E02281B00000A2A42534A4201000100000000000C00000076322E302E35303732370000000005006C000000D8020000237E000044030000E402000023537472696E677300000000280600005C0000002355530084060000100000002347554944000000940600000401000023426C6F620000000000000002000001471502000900000000FA0133001600000100000012000000020000000C0000000F0000001B0000000300000007000000010000000200000000000A000100000000000600390032000A0061004C000A0069004C000A00A6004C000600F000E6000600350115010600550115010A00940179010600BA01E6000600D701E60006000E02E60006001C02E60006002702E60006003B02320006007B02E60006008602E60006009302E6000600A302E60000000000010000000000010001000100100014000000050001000100502000000000960073000A000100AC200000000096007E000A000200E82000000000960085000A0003002C2100000000960090000A00040058210000000096009A000A0005009421000000009600AF0011000600E421000000009600C000180007002422000000009600CF000A0009005022000000009600DA0021000A007C22000000009100DF002A000C00BC22000000009100F70030000E0010230000000086180F013800100000000100A90100000100A90100000100A90100000100A90100000100050200000100130200000100510200000200130200000100050200000100050200000200560200000100680200000200720200000100B80200000200C50231000F013C0039000F01380041000F0138000900B10146004900C4014A001100CB014F004900E5015B004900F50166004900FE0174005900C4014A0061000F01790029003002800021000F018400210040028A0029004B0238005900FE01740019005E02460061000F019F0081000F01A80029009E02AE009100AE02B50091004B02380021000F0138002900D002C1002900D502C9002900DB02380009000F01380020001B0041002E000B00DB002E001300E400550061006C008F009800BA00D100048000000000000000000000000000000000730100000200000000000000000000000100290000000000020000000000000000000000010040000000000000000000003C4D6F64756C653E007463636C722E646C6C0055736572446566696E656446756E6374696F6E73006D73636F726C69620053797374656D004F626A6563740053797374656D2E446174610053797374656D2E446174612E53716C54797065730053716C427974650053716C537472696E670044697250726573656E74004E6577446972004469724973456D7074790052656D6F76654469720046696C6550726573656E740053716C4279746573004C6F6164424C4F4246726F6D46696C650053617665424C4F42546F46696C650052656D6F766546696C6500784C4F47004C4F475478740053797374656D2E494F0053747265616D00436F707942797465734265747765656E53747265616D73002E63746F720053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465007463636C72004D6963726F736F66742E53716C5365727665722E5365727665720053716C46756E6374696F6E417474726962757465004469724E616D6500546F537472696E67004469726563746F727900457869737473006F705F496D706C69636974004469726563746F7279496E666F004372656174654469726563746F72790047657446696C65730044656C6574650046696C65506174680046696C650066696C654E616D650046696C6553747265616D0046696C654D6F6465006765745F4C656E6774680042797465006765745F53747265616D00436C6F736500626C6F62004C6F6754657874006765745F56616C75650066696C655F70617468006C6F675F746578740046696C654163636573730053747265616D577269746572005365656B4F726967696E005365656B00546578745772697465720057726974654C696E6500736F7572636553747265616D006465737453747265616D005265616400577269746500466C75736800000000001563003A005C0063006C0072002E006C006F0067000019440069007200500072006500730065006E0074003D0031000019440069007200500072006500730065006E0074003D003000000D4E0065007700440069007200000000009B46FC343FE08E41881563CD4163F8080008B77A5C561934E0890600011109110D0600011211110D08000211091211110D0800021109110D110D050002010E0E070002011215121503200001042001010804010000000320000E040001020E05000111090505070211090205000112290E04070111090500011D0E0E0707031D0E110902040001010E062002010E11350320000A052001011D05042000121508070312311211121106070212311109082003010E1135113D0520010112150620020A0A1145042001010E06070212311241072003081D050808072003011D0508080907050812111D0508020801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F77730100D82A00000000000000000000EE2A0000002000000000000000000000000000000000000000000000E02A00000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001000000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000000000048000000584000003C02000000000000000000003C0234000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000000000000000000000000000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B0049C010000010053007400720069006E006700460069006C00650049006E0066006F0000007801000001003000300030003000300034006200300000002C0002000100460069006C0065004400650073006300720069007000740069006F006E000000000020000000300008000100460069006C006500560065007200730069006F006E000000000030002E0030002E0030002E003000000034000A00010049006E007400650072006E0061006C004E0061006D00650000007400630063006C0072002E0064006C006C0000002800020001004C006500670061006C0043006F0070007900720069006700680074000000200000003C000A0001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000007400630063006C0072002E0064006C006C000000340008000100500072006F006400750063007400560065007200730069006F006E00000030002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000030002E0030002E0030002E003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000003B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    WITH PERMISSION_SET = EXTERNAL_ACCESS
    GO
    
    --
    -- Definition for table T_IMAGE : 
    --
    
    CREATE TABLE [dbo].[T_IMAGE] (
      [F_IMAGE_NUM] bigint IDENTITY(1, 1) NOT NULL,
      [F_DATA_NUM] bigint NULL,
      [F_CAM] int NULL,
      [F_IMAGE] varbinary(max) NULL
    )
    ON [PRIMARY]
    GO
    
    --
    -- Definition for user-defined function DirIsEmptyCLR : 
    --
    GO
    CREATE FUNCTION [dbo].[DirIsEmptyCLR]
      ( @dir nvarchar(128) )
    RETURNS tinyint
    WITH EXECUTE AS CALLER, CALLED ON NULL INPUT
    AS
    EXTERNAL NAME [CLRFunctions].[UserDefinedFunctions].[DirIsEmpty]
    GO
    
    --
    -- Definition for user-defined function DirPresentCLR : 
    --
    GO
    CREATE FUNCTION [dbo].[DirPresentCLR]
      ( @dir nvarchar(128) )
    RETURNS tinyint
    WITH EXECUTE AS CALLER, CALLED ON NULL INPUT
    AS
    EXTERNAL NAME [CLRFunctions].[UserDefinedFunctions].[DirPresent]
    GO
    
    --
    -- Definition for user-defined function FilePresentCLR : 
    --
    GO
    CREATE FUNCTION [dbo].[FilePresentCLR]
      ( @fil nvarchar(128) )
    RETURNS tinyint
    WITH EXECUTE AS CALLER, CALLED ON NULL INPUT
    AS
    EXTERNAL NAME [CLRFunctions].[UserDefinedFunctions].[FilePresent]
    GO
    
    --
    -- Definition for user-defined function LoadBLOBFromFileCLR : 
    --
    GO
    CREATE FUNCTION [dbo].[LoadBLOBFromFileCLR]
      ( @fil nvarchar(128) )
    RETURNS varbinary(max)
    WITH EXECUTE AS CALLER, CALLED ON NULL INPUT
    AS
    EXTERNAL NAME [CLRFunctions].[UserDefinedFunctions].[LoadBLOBFromFile]
    GO
    
    --
    -- Definition for user-defined function NewDirCLR : 
    --
    GO
    CREATE FUNCTION [dbo].[NewDirCLR]
      ( @dir nvarchar(128) )
    RETURNS tinyint
    WITH EXECUTE AS CALLER, CALLED ON NULL INPUT
    AS
    EXTERNAL NAME [CLRFunctions].[UserDefinedFunctions].[NewDir]
    GO
    
    --
    -- Definition for user-defined function RemoveDirCLR : 
    --
    GO
    CREATE FUNCTION [dbo].[RemoveDirCLR]
      ( @dir nvarchar(128) )
    RETURNS tinyint
    WITH EXECUTE AS CALLER, CALLED ON NULL INPUT
    AS
    EXTERNAL NAME [CLRFunctions].[UserDefinedFunctions].[RemoveDir]
    GO
    
    --
    -- Definition for user-defined function RemoveFileCLR : 
    --
    GO
    CREATE FUNCTION [dbo].[RemoveFileCLR]
      ( @fil nvarchar(128) )
    RETURNS tinyint
    WITH EXECUTE AS CALLER, CALLED ON NULL INPUT
    AS
    EXTERNAL NAME [CLRFunctions].[UserDefinedFunctions].[RemoveFile]
    GO
    
    --
    -- Definition for user-defined function SaveBLOBToFileCLR : 
    --
    GO
    CREATE FUNCTION [dbo].[SaveBLOBToFileCLR]
      ( @img varbinary(max),
      @fil nvarchar(128) )
    RETURNS tinyint
    WITH EXECUTE AS CALLER, CALLED ON NULL INPUT
    AS
    EXTERNAL NAME [CLRFunctions].[UserDefinedFunctions].[SaveBLOBToFile]
    GO
    
    --
    -- Definition for user-defined function xLOGCLR : 
    --
    GO
    CREATE FUNCTION [dbo].[xLOGCLR]
      ( @fil nvarchar(128),
      @log nvarchar(128) )
    RETURNS tinyint
    WITH EXECUTE AS CALLER, CALLED ON NULL INPUT
    AS
    EXTERNAL NAME [CLRFunctions].[UserDefinedFunctions].[xLOG]
    GO
    
    --
    -- Definition for stored procedure SAVE_IMAGE : 
    --
    GO
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE dbo.SAVE_IMAGE
    (
        @DAT_INDX bigint,
        @CAM_ID int,
        @IMAGE varbinary(max)
    )
    AS
    begin
    declare 
    	@ImageIndex bigint,
       @ImageDirPresent tinyint,
       @I tinyint,
       @ImageDir varchar(128), 
       @ImagePath varchar(128) 
    set @I = dbo.xLOGCLR('c:\sp.log', '1') 
    /*Узнаем номер вставляемого изображения*/ 
    set @ImageIndex = IDENT_CURRENT ('T_IMAGE')
    set @I = dbo.xLOGCLR('c:\sp.log', '2') 
    set @ImageIndex = @ImageIndex+1
    set @I = dbo.xLOGCLR('c:\sp.log', '3') 
    set @ImageDirPresent = dbo.DirPresentCLR('C:\Program Files\TC\DataBase\IMAGES')
    set @I = dbo.xLOGCLR('c:\sp.log', '4='+STR(@ImageDirPresent)) 
    if (@ImageDirPresent=1) and not(@IMAGE is null)
    	begin
    	set @I = dbo.xLOGCLR('c:\sp.log', '1-1')    
       set @ImageDir = 'C:\Program Files\TC\DataBase\IMAGES\'+LTRIM (STR(@ImageIndex / 1000, 12))
    	set @I = dbo.xLOGCLR('c:\sp.log', '1-2') 
    	set @ImageDirPresent = dbo.DirPresentCLR(@ImageDir)
    	set @I = dbo.xLOGCLR('c:\sp.log', '1-3') 
       if @ImageDirPresent = 0
       	begin
          set @I = dbo.xLOGCLR('c:\sp.log', '1-1-1')
          set @I = dbo.NewDirCLR(@ImageDir)
          set @I = dbo.xLOGCLR('c:\sp.log', '1-1-2')
          end
    	set @I = dbo.xLOGCLR('c:\sp.log', '1-4') 
       set @ImagePath = @ImageDir+'\'+LTRIM (STR(@ImageIndex, 12))+'.jpg'
    	set @I = dbo.xLOGCLR('c:\sp.log', '1-5') 
       select @I = dbo.SaveBLOBToFileCLR(@IMAGE, @ImagePath)
    	set @I = dbo.xLOGCLR('c:\sp.log', '1-6') 
       insert into T_IMAGE(F_DATA_NUM, F_CAM) values (@DAT_INDX, @CAM_ID)
    	set @I = dbo.xLOGCLR('c:\sp.log', '1-7') 
       end
    else
    	begin
    	set @I = dbo.xLOGCLR('c:\sp.log', '2-1') 
       insert into T_IMAGE(F_DATA_NUM, F_CAM, F_IMAGE) values (@DAT_INDX, @CAM_ID, @IMAGE)
    	set @I = dbo.xLOGCLR('c:\sp.log', '2-2') 
       end
    end
    GO
    
    --
    -- Definition for indices : 
    --
    
    ALTER TABLE [dbo].[T_IMAGE]
    ADD UNIQUE NONCLUSTERED ([F_IMAGE_NUM])
    WITH (
      PAD_INDEX = OFF,
      IGNORE_DUP_KEY = OFF,
      STATISTICS_NORECOMPUTE = OFF,
      ALLOW_ROW_LOCKS = ON,
      ALLOW_PAGE_LOCKS = ON)
    ON [PRIMARY]
    GO
    
    --
    -- Object Authorization
    --
    
    ALTER AUTHORIZATION ON ASSEMBLY::[CLRFunctions] TO [dbo]
    GO

    Код сборки:
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
    using System.IO;
    using System.Text;
    
    public class UserDefinedFunctions 
    	{
    	[SqlFunction()]
    	
    	public static SqlByte DirPresent(SqlString DirName)
    		{
    		if (System.IO.Directory.Exists(DirName.ToString()))
    		{
    			LOGTxt(@"c:\clr.log", @"DirPresent=1");
    			return 1;
    		}
    		else
    		{
    			LOGTxt(@"c:\clr.log", @"DirPresent=0");
    			return 0;
    		}
    		}
    	
    	public static SqlByte NewDir(SqlString DirName)
    		{
    		System.IO.Directory.CreateDirectory(DirName.ToString());
    		LOGTxt(@"c:\clr.log", @"NewDir");
    		return 1;
    		}
    	
    	public static SqlByte DirIsEmpty(SqlString DirName)
    		{
    		string [] FileEntries = System.IO.Directory.GetFiles(DirName.ToString());
    		if (FileEntries.Length>0)
    			return 0;
    		else
    			return 1;
    		}	
    	
    	public static SqlByte RemoveDir(SqlString DirName)
    		{
    		System.IO.Directory.Delete(DirName.ToString());
    		return 1;
    		}	
    	
    	public static SqlByte FilePresent(SqlString FilePath)
    		{
    		if (System.IO.File.Exists(FilePath.ToString()))
    			return 1;
    		else
    			return 0;
    		}	
    	
    	/// Функция читает содержимое файла в блоб. Пример вызова:
    	/// select cast(dbo.LoadBLOBFromFile('c:\Demo\FILESTREAM_импорт-экспорт файла.txt') as varchar(max))
      	public static SqlBytes LoadBLOBFromFile(SqlString fileName)
       	{
          FileStream fs= new FileStream(fileName.ToString(), FileMode.Open);
          SqlBytes blob= new SqlBytes(new byte[fs.Length]);
          CopyBytesBetweenStreams(fs, blob.Stream);
          fs.Close(); 
          return blob;
        	}
     
        /// Процедура пишет в файл содержимое блоба. Пример вызова:
        /// declare @x varbinary(max)
        /// set @x = dbo.LoadBLOBFromFile('c:\Demo\FILESTREAM_импорт-экспорт файла.txt')
        /// exec SaveBLOBToFile @x, 'c:\Demo\FILESTREAM_импорт-экспорт файла1.txt'
    	public static SqlByte SaveBLOBToFile(SqlBytes blob, SqlString fileName)
       	{
          FileStream fs= new FileStream(fileName.ToString(), FileMode.OpenOrCreate);
          CopyBytesBetweenStreams(blob.Stream, fs);
          fs.Close();
    		return 1;
        	}
    	
    	public static SqlByte RemoveFile(SqlString FilePath)
    		{
    		System.IO.File.Delete(FilePath.ToString());
    		return 1;
    		}	
    	
    	public static SqlByte xLOG(SqlString FilePath, SqlString LogText)
    		{
    		LOGTxt(FilePath.Value, LogText.Value);
    		return 1;
    		}	
    	
    	private static void LOGTxt(String file_path, String log_text)
       	{
    		FileStream FS = new FileStream(file_path, FileMode.OpenOrCreate, FileAccess.Write);
     		StreamWriter SW = new StreamWriter(FS);
     		FS.Seek(0, SeekOrigin.End);
    		SW.WriteLine(log_text);
    		SW.Close();
    		FS.Close();
    		}
    	
    	private static void CopyBytesBetweenStreams(Stream sourceStream, Stream destStream)
       	{
          int bufLen= 100000;
          SqlBytes blob= new SqlBytes();
          byte[] buffer= new byte[bufLen];
          int count;
          for (; ; )
          	{
             count = sourceStream.Read(buffer, 0, bufLen);
             if (count == 0) 
             	break;
             destStream.Write(buffer, 0, count);           
    			}
          destStream.Flush();
        	}
    	} 

    4) Удаляем "C:\Program Files\TC\DataBase\IMAGES" и запускаем ЕДИНОЖДЫ процедуру "dbo.SAVE_IMAGE"

    5) Получаем созданный каталог "C:\Program Files\TC\DataBase\IMAGES" и лог "clr.log":
    "DirPresent=0
    DirPresent=0
    NewDir
    DirPresent=1
    DirPresent=1
    DirPresent=1
    DirPresent=1"

    Лог "sp.log":
    "1
    2
    3
    4= 0
    1-1
    1-2
    1-3
    1-1-1
    1-1-2
    1-4
    1-5
    1-6
    1-7
    2-1
    2-2
    1
    2
    3
    4= 1
    1-1
    1-2
    1-3
    1-4
    1-5
    1-6
    1-7
    1
    2
    3
    4= 1
    1-1
    1-2
    1-3
    1-4
    1-5
    1-6
    1-7"

    Если вам все понятно, ОБЪЯСНИТЕ мне непонимающему: ПУРКЕ и КЕПАСА сие происходит?
    15 авг 11, 09:47    [11118090]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    kDnZP
    Member [заблокирован]

    Откуда: ★[msg=16399436]★[msg=20850760]
    Сообщений: 11289
    ALTO_MAN, решил проверить у себя.
    exec dbo.SAVE_IMAGE 1, 2, NULL
    Получаю в корне С:\ два файла:
    + sp.log
    1
    2
    3
    4= 0
    2-1
    2-2

    + clr.log
    DirPresent=0

    Щаз почитаю что оно делает и более точно проверю))).
    15 авг 11, 10:20    [11118260]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    kDnZP
    Member [заблокирован]

    Откуда: ★[msg=16399436]★[msg=20850760]
    Сообщений: 11289
    1. Чтобы не править код процедуры - создал каталог C:\Program Files\TC\DataBase\IMAGES
    2.
    DECLARE @tst VARBINARY(MAX)
    SET @tst=CAST('123' AS VARBINARY(MAX))
    exec dbo.SAVE_IMAGE 1, 2, @tst
    3. Получил: C:\Program Files\TC\DataBase\IMAGES\0\2.jpg
    4. Дописался
    + sp.log
    1
    2
    3
    4= 0
    2-1
    2-2
    1
    2
    3
    4= 1
    1-1
    1-2
    1-3
    1-1-1
    1-1-2
    1-4
    1-5
    1-6
    1-7

    5. Дописался
    + clr.log
    DirPresent=0
    DirPresent=0
    DirPresent=0
    DirPresent=1
    DirPresent=1
    DirPresent=0
    NewDir


    Вродь все верно, али как? Чего дальше?
    SELECT @@VERSION
    Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86)   Dec 10 2010 10:56:29
    Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    15 авг 11, 10:35    [11118334]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    ALTO_MAN
    Member

    Откуда:
    Сообщений: 13
    kDnZP, Спасибо за участие...
    DECLARE @tst VARBINARY(MAX)
    SET @tst=CAST('123' AS VARBINARY(MAX))
    exec dbo.SAVE_IMAGE 1, 2, @tst
    
    Без каталога "C:\Program Files\TC\DataBase\IMAGES" вообще выдает
    sp.log:"1
    2
    3
    4= 0
    1-1
    1-2
    1-3
    1-1-1
    1-1-2
    1-4
    1-5
    1-6
    1-7
    2-1
    2-2
    1
    2
    3
    4= 1
    1-1
    1-2
    1-3
    1-1-1
    1-1-2
    1-4
    1-5
    1-6
    1-7
    2-1
    2-2
    1
    2
    3
    4= 1
    1-1
    1-2
    1-3
    1-4
    1-5
    1-6
    1-7
    1
    2
    3
    4= 1
    1-1
    1-2
    1-3
    1-1-1
    1-1-2
    1-4
    1-5
    1-6
    1-7
    2-1
    2-2
    1
    2
    3
    4= 1
    1-1
    1-2
    1-3
    1-4
    1-5
    1-6
    1-7"

    SELECT @@VERSION
    :
    Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
    Jul 9 2008 14:43:34
    Copyright (c) 1988-2008 Microsoft Corporation
    Express Edition on Windows NT 6.0 <X86> (Build 6002: Service Pack 2)

    Короче, бред какой-то...
    15 авг 11, 11:10    [11118526]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    SamMan
    Member

    Откуда: Moscow
    Сообщений: 759
    ALTO_MAN
    Короче, бред какой-то


    Не без этого. Вот как уменьшить вероятность его - бреда - возникновения:

    1. Повторяю красными буквами и 2-й раз: создачить ЧИСТУЮ БАЗУ! В вашем последнем скрипте нет команды CREATE DATABASE.
    2. НЕ СОЗДАВАТЬ никаких объектов не имеющих прямого отношения к экспериментам. Мы сейчас выясняем - каким загадочным образом dbo.SAVE_IMAGE уходит на ветку '1-1'. Причем здесь
    ADD UNIQUE NONCLUSTERED ([F_IMAGE_NUM])
    ?
    3. Наконец - приводите ОДИН код проблемной сборки. Пусть он неверен - но пусть он будет единообразен. А у вас DirPresent то 10/20 возвращает, то 1/0. Нам с вами, конечно, без разницы какую именно сборку препарировать, но давайте выберем из вашего вороха одну (но любую) и будем дальше измываться только над ней, что бы каждый раз не начинать почти сначала.

    Еще раз говорю - проделайте все шаги из моего поста предыдущего поста на чистой базе (не исключено что еще потребуется чистый компьютер, но пока об этом ничего не говорит) и добейтесь результата который просто обязан быть и который получился у меня с первой же попытки.
    15 авг 11, 14:03    [11120019]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    Случайно заглянувший
    Guest
    Есть ощущение, что SQL Server вначале проверяет хранимую процедуру, строит план выполнения или т.п.
    16 авг 11, 10:48    [11124660]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    ALTO_MAN
    Member

    Откуда:
    Сообщений: 13
    Случайно заглянувший
    Есть ощущение, что SQL Server вначале проверяет хранимую процедуру, строит план выполнения или т.п.


    Может быть... Но странно, снес предыдущую версию сервака, поставил свежую (Microsoft SQL Server Express Edition 10.50.1600.1)...
    И о чудо!!! Заработало!!! Всё как надо. Тот же самый код, но уже без повторов!
    Я был лучшего мнения о МС-СКуЛе до сиго происшествия.
    16 авг 11, 13:04    [11125884]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    ALTO_MAN
    Я был лучшего мнения о МС-СКуЛе до сиго происшествия.

    - Профайлер я так понимаю никто для трассировки не запускал ? Типа у нас свой механизм логирования
    - Текущую RTM версию патчить тоже никто не собирался. Не смотря на 2 сервиспака и кучу фиксов
    - То, что у других это не воспроизводится, значения конечно же не имеет
    16 авг 11, 13:13    [11125969]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31962
    Glory
    ALTO_MAN
    Я был лучшего мнения о МС-СКуЛе до сиго происшествия.

    - Профайлер я так понимаю никто для трассировки не запускал ? Типа у нас свой механизм логирования
    - Текущую RTM версию патчить тоже никто не собирался. Не смотря на 2 сервиспака и кучу фиксов
    - То, что у других это не воспроизводится, значения конечно же не имеет
    Понятное дело: принцип эникейщика - переставить винды, не прочитав сообщение об ошибке :-)
    16 авг 11, 13:15    [11125983]     Ответить | Цитировать Сообщить модератору
     Re: CLR - ОТКУДА БЕРЕТСЯ ВЫПОЛНЕНИЕ???  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    И SQL Manager 2011 Lite for SQL Server 3.7.0.1 мне тоже доверия не внушает
    Он поддерживает дебаггер сервера ?
    16 авг 11, 13:20    [11126038]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить