Обход ограничения на длину параметра в ХП на SQL2005
От: Improved  
Дата: 23.10.06 14:23
Оценка:
Кто нибудь сталкивался с проблемой ограничения размера в 8000 байт у параметров ХП в SQL2005, как это лечится???
Re: Обход ограничения на длину параметра в ХП на SQL2005
От: pkarklin  
Дата: 24.10.06 05:07
Оценка:
Здравствуйте, Improved, Вы писали:

I>Кто нибудь сталкивался с проблемой ограничения размера в 8000 байт у параметров ХП в SQL2005, как это лечится???


Нет такой проблемы ибо нет такого ограничения!
Re[2]: Обход ограничения на длину параметра в ХП на SQL2005
От: Improved  
Дата: 24.10.06 06:56
Оценка:
Здравствуйте, pkarklin, Вы писали:

P>Здравствуйте, Improved, Вы писали:


I>>Кто нибудь сталкивался с проблемой ограничения размера в 8000 байт у параметров ХП в SQL2005, как это лечится???


P>Нет такой проблемы ибо нет такого ограничения!


Тогда как обьяснить, то что при выполнении ХП написанной на CLR она возвращает ByteStream который длинной в 16000 происходит эксепшн:
Trying to convert return value or output parameter of size 16384 bytes to a T-SQL type with a smaller size limit of 8000 bytes. Тоже самое могу и сказать про nvarchar больше 8000 не берет. Зато вот XML любой длинны.
Re[3]: Обход ограничения на длину параметра в ХП на SQL2005
От: IB Австрия http://rsdn.ru
Дата: 24.10.06 07:28
Оценка:
Здравствуйте, Improved, Вы писали:

I> Тоже самое могу и сказать про nvarchar больше 8000 не берет.

Потому что если хочется больше 8000, то надо использовать nvarchar(max)
... << RSDN@Home 1.2.0 alpha rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[4]: Обход ограничения на длину параметра в ХП на SQL2005
От: Improved  
Дата: 24.10.06 07:36
Оценка:
Здравствуйте, IB, Вы писали:

IB>Здравствуйте, Improved, Вы писали:


I>> Тоже самое могу и сказать про nvarchar больше 8000 не берет.

IB>Потому что если хочется больше 8000, то надо использовать nvarchar(max)

Уже пробывал, на один символ в nvarchar уходит 2 байта при max получается 16000, все дальше no way. Мне непонятно почему XML я могу передать любого размера а все остальные типы ограничены.
Re[3]: Обход ограничения на длину параметра в ХП на SQL2005
От: снежок Россия  
Дата: 24.10.06 07:36
Оценка:
Здравствуйте, Improved, Вы писали:
I>Тогда как обьяснить, то что при выполнении ХП написанной на CLR она возвращает ByteStream который длинной в 16000 происходит эксепшн:
I>Trying to convert return value or output parameter of size 16384 bytes to a T-SQL type with a smaller size limit of 8000 bytes. Тоже самое могу и сказать про nvarchar больше 8000 не берет. Зато вот XML любой длинны.
Поди текст како-нибудь передаете..., а приводите к nvarchar вместо того чтобы залить в CLR этот текст в параметр типа text.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Обход ограничения на длину параметра в ХП на SQL2005
От: Improved  
Дата: 24.10.06 07:42
Оценка:
Здравствуйте, снежок, Вы писали:

С>Здравствуйте, Improved, Вы писали:

I>>Тогда как обьяснить, то что при выполнении ХП написанной на CLR она возвращает ByteStream который длинной в 16000 происходит эксепшн:
I>>Trying to convert return value or output parameter of size 16384 bytes to a T-SQL type with a smaller size limit of 8000 bytes. Тоже самое могу и сказать про nvarchar больше 8000 не берет. Зато вот XML любой длинны.
С>Поди текст како-нибудь передаете..., а приводите к nvarchar вместо того чтобы залить в CLR этот текст в параметр типа text.

В том то и дело что не текст, а сериализованный обьект, просто уже пробывал по всякому, но он иногда бывает достаточно увесист.
Re[5]: Обход ограничения на длину параметра в ХП на SQL2005
От: IB Австрия http://rsdn.ru
Дата: 24.10.06 08:20
Оценка:
Здравствуйте, Improved, Вы писали:

I>Уже пробывал, на один символ в nvarchar уходит 2 байта при max получается 16000, все дальше no way.

Значит что-то не так пробуешь...

I> Мне непонятно почему XML я могу передать любого размера а все остальные типы ограничены.

max ограничен 2-мя гигабайтами. Могут быть проблемы при передаче по сети, когда упираешься в размер пакета, но это порядка 50 мегабайт по умолчанию, других ограничений нет.
Мы уже победили, просто это еще не так заметно...
Re: Обход ограничения на длину параметра в ХП на SQL2005
От: Lloyd Россия  
Дата: 24.10.06 09:01
Оценка:
Здравствуйте, Improved, Вы писали:

I>Кто нибудь сталкивался с проблемой ограничения размера в 8000 байт у параметров ХП в SQL2005, как это лечится???


Гм. Что я делаю неправильно?

USE [Test]
GO
/****** Object:  Table [dbo].[LongTextTable]    Script Date: 10/24/2006 12:57:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[LongTextTable](
    [LongText] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]


using System;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SqlConnection connection = new SqlConnection(@"Integrated Security=SSPI;SERVER=.\SQLEXPRESS;DATABASE=Test"))
            {
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction();

                SqlCommand insertCommand = connection.CreateCommand();
                insertCommand.Transaction = transaction;
                insertCommand.CommandType = CommandType.Text;
                insertCommand.CommandText = "INSERT INTO [dbo].[LongTextTable] ([LongText]) VALUES (@LongText)";
                insertCommand.Parameters.Add("@LongText", SqlDbType.NVarChar).Value = new string('ы', 100000);
                insertCommand.ExecuteNonQuery();

                SqlCommand selectComand = connection.CreateCommand();
                selectComand.Transaction = transaction;
                selectComand.CommandType = CommandType.Text;
                selectComand.CommandText = "SELECT [LongText] FROM [dbo].[LongTextTable]";
                using (SqlDataReader reader = selectComand.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        string longText = (string)reader["LongText"];
                        Console.WriteLine(longText.Length);
                    }
                }

                transaction.Rollback();
            }
        }
    }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Обход ограничения на длину параметра в ХП на SQL2005
От: Shirvanoff  
Дата: 24.10.06 09:06
Оценка:
Здравствуйте, Improved, Вы писали:

I>Здравствуйте, IB, Вы писали:


IB>>Здравствуйте, Improved, Вы писали:


I>>> Тоже самое могу и сказать про nvarchar больше 8000 не берет.

IB>>Потому что если хочется больше 8000, то надо использовать nvarchar(max)

I>Уже пробывал, на один символ в nvarchar уходит 2 байта при max получается 16000, все дальше no way. Мне непонятно почему XML я могу передать любого размера а все остальные типы ограничены.


Значит не правильно пробовали.
Из msdn:

nvarchar [ ( n | max ) ]
Variable-length Unicode character data. n can be a value from 1 through 4,000. max indicates that the maximum storage size is 2^31-1 bytes. The storage size, in bytes, is two times the number of characters entered + 2 bytes.

Re[2]: Обход ограничения на длину параметра в ХП на SQL2005
От: Improved  
Дата: 24.10.06 09:47
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Гм. Что я делаю неправильно?


Тут запись идет напрямую в таблицу, без использования ХП. Видимо вся беда в автоматическом приведении типов в CLR он как то тупо их конвертит из С# в его аналоги T — SQL других мыслей пока нет.
Re[3]: Обход ограничения на длину параметра в ХП на SQL2005
От: Lloyd Россия  
Дата: 24.10.06 10:04
Оценка:
Здравствуйте, Improved, Вы писали:

I>Тут запись идет напрямую в таблицу, без использования ХП. Видимо вся беда в автоматическом приведении типов в CLR он как то тупо их конвертит из С# в его аналоги T — SQL других мыслей пока нет.


У меня все номально

USE [Test]
GO
/****** Object:  StoredProcedure [dbo].[prLongTextTableIns]    Script Date: 10/24/2006 14:00:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[prLongTextTableIns](@LongText NVARCHAR(MAX))
AS
INSERT INTO [dbo].[LongTextTable] ([LongText]) VALUES (@LongText)


using System;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SqlConnection connection = new SqlConnection(@"Integrated Security=SSPI;SERVER=.\SQLEXPRESS;DATABASE=Test"))
            {
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction();

                SqlCommand insertCommand = connection.CreateCommand();
                insertCommand.Transaction = transaction;
                insertCommand.CommandType = CommandType.StoredProcedure;
                insertCommand.CommandText = "prLongTextTableIns";
                insertCommand.Parameters.Add("@LongText", SqlDbType.NVarChar).Value = new string('ы', 100000);
                insertCommand.ExecuteNonQuery();

                SqlCommand selectComand = connection.CreateCommand();
                selectComand.Transaction = transaction;
                selectComand.CommandType = CommandType.Text;
                selectComand.CommandText = "SELECT [LongText] FROM [dbo].[LongTextTable]";
                using (SqlDataReader reader = selectComand.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        string longText = (string)reader["LongText"];
                        Console.WriteLine(longText.Length);
                    }
                }

                transaction.Rollback();
            }
        }
    }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Обход ограничения на длину параметра в ХП на SQL2005
От: Improved  
Дата: 24.10.06 10:14
Оценка:
Здравствуйте, Improved, Вы писали:

I>Кто нибудь сталкивался с проблемой ограничения размера в 8000 байт у параметров ХП в SQL2005, как это лечится???


Что у меня неправильно??

//SQL Stored procedure
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void Test(out object outputstream)
{
SqlCommand cmd = new SqlCommand();
outputstream = null;
using (SqlConnection conn = new SqlConnection("context connection = true"))
{
cmd.Connection = conn;
conn.Open();
cmd.CommandText = "SELECT * FROM SYS.OBJECTS FOR XML AUTO";
string xml = String.Empty;
for (int i = 0; i < 20; i++)
xml += cmd.ExecuteScalar();
conn.Close();
outputstream = xml;
}
}
};


//Client App

SqlCommand cmd = new SqlCommand(null, conn);
cmd.Parameters.Clear();
cmd.CommandText = "TEST";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@outputstream", SqlDbType.Variant, 100000).Direction = ParameterDirection.Output;
cmd.CommandTimeout = 300;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.