Использование varchar (max) в сохраненном процессе. Почему значение вставки усекается? - PullRequest
3 голосов
/ 14 февраля 2011

Я новичок как в SQL 2005, так и в Enterprise Library (версия 4.) Я хотел бы вызвать хранимый процесс и передать строку, которая превышает 8000 символов.Столбец в БД определяется как varchar (max).Я решил начать с небольшого теста с вызова хранимой процедуры из T-SQL, и был удивлен, что значение вставленной строки было усечено даже для короткой строки.

CREATE TABLE [dbo].[ChadTest](
    [TestParam] [varchar](max) NOT NULL
) ON [CMISII_DATA]

GO

ALTER PROCEDURE [dbo].[spr_ChadTest]
(
 @TestParam varchar(max)
 )
AS
BEGIN
INSERT INTO ChadTest
   (TestParam) VALUES (@TestParam)
END

DECLARE @RC int
DECLARE @TestParam varchar

-- TODO: Set parameter values here.
SET @TestParam = '12345'
EXECUTE @RC = [CMISII].[dbo].[spr_ChadTest] 
   @TestParam

Select TestParam, len(TestParam) from chadtest

Вывод:

1           1

Как только я приведу этот простой пример в действие, мне нужно будет выяснить, как передать длинную строку в SP из кода VB.NET с помощью библиотеки Enterprise.Каким будет тип данных параметра?Я не вижу перегруженной версии метода AddInParameter, который принимает длину, и при этом я не вижу перечисление "varchar (max)" в качестве доступного типа данных.

   dbCmd = db.GetStoredProcCommand("spr_ChadTest") 
    db.AddInParameter(dbCmd, "TestParam", SqlDbType.VarChar, TestParam.ToString) 

Спасибо!

Ответы [ 2 ]

1 голос
/ 14 февраля 2011
DECLARE @TestParam varchar 

- проблема в вашем TSQL. Вам нужно объявить это как varchar(max) тип данных, чтобы избежать усечения при длине 1 символа.

0 голосов
/ 14 февраля 2011

В определении переменной для TestParam отсутствует (MAX) в конце. Это решит проблему SQL-запроса. Следующий код добавит параметр к SqlCommand, позволяющему использовать VARCHAR(MAX) из приложения VB .Net ASP.

' Set up the output parameter to retrieve the summary.
Dim paramSummary As SqlParameter = New SqlParameter("@TestParam", SqlDbType.VarChar, -1)
command.Parameters.Add(paramSummary)

Следующая ссылка отображает дополнительную информацию

...