2010-04-26 42 views
7

Tôi có một chuỗi có độ dài 1.44.000 phải được chuyển thành tham số cho một thủ tục được lưu trữ, đó là truy vấn chọn trên bảng. Khi đưa ra điều này là trong một truy vấn (trong C#) làm việc tốt của nó. Nhưng khi tôi vượt qua nó như là một tham số để lưu trữ thủ tục nó không hoạt động.Độ dài tối đa của tham số chuỗi đối với quy trình được lưu trữ là bao nhiêu?

Dưới đây là thủ tục lưu trữ của tôi ở đâu trong tôi đã tuyên bố tham số này như NVARCHAR (MAX)

------------------------------------------------------ 
set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 

CREATE PROCEDURE [dbo].[ReadItemData](@ItemNames NVARCHAR(MAX),@TimeStamp as DATETIME) 

AS 

select * from ItemData 

where ItemName in (@ItemNames) AND [email protected] 

--------------------------------------------------------------------- 

Ở đây @ItemNames tham số là một chuỗi concatinated với tên gọi khác nhau như 'Item1', 'Item2' , 'Item3' .... v.v.

Có ai biết điều gì đã xảy ra ở đây không?

Cảm ơn & Trân

Padma

+2

Độ dài tối đa của tham số chuỗi cho quy trình được lưu trữ có thể phụ thuộc vào cơ sở dữ liệu. Bạn đang sử dụng SQL Server? Phiên bản nào? –

Trả lời

3

Từ vẻ của cơ sở dữ liệu cú pháp có vẻ như Sql Server, these are the maximum sizes of things in Sql Server.

Bytes per short string column 8,000 

Có lẽ là giới hạn.

Mặc dù:

Bytes mỗi varchar (max), varbinary (max), xml, văn bản hoặc hình ảnh cột 2^31-1

(tức là 2,147,483,647) gợi ý rằng Sql Server sẽ xử lý nó nhưng đối với ado.net.

+0

mặc dù giới hạn kích thước là 2^31-1, nó không lấy tham số này được đưa ra như sau từ mã: command.Parameters.Add ("@ ItemNames", SqlDbType.VarChar) .Value = itemNames.ToString (); – padmavathi

+0

Tôi không nghĩ rằng giới hạn là Sql Server, trong trường hợp này - nhưng ADO.NET. Tôi nhớ (trở lại trong ngày) khi tôi đang sử dụng ADO/VBScript có giới hạn khoảng 8.040 byte cho bản ghi - Tôi sẽ xem liệu tôi có thể tìm thấy tham chiếu hay không, nhưng cũng có thể có giới hạn tích lũy cho đầu vào hoặc đầu ra Các thông số trên ADO.NET – amelvin

+0

OK, do đó, chỉ cần được rõ ràng, có khoảng 1000 byte cho mỗi ký tự –

0

tối đa bạn có thể vượt qua 8000 ký tự trong VARCHAR(MAX) tài sản và 4000 nhân vật trong NVARCAHR(MAX)

Nếu bạn muốn vượt qua nhiều rồi mà sau đó bạn cần phải sử dụng tài khoản Xác định Loại Bảng như một tham số.

Bước 1: Cần tạo User Define Table Type.

CREATE TYPE udtt_ItemNames AS TABLE 
(
    Item nvarchar(100)  
) 

Bước 2: Người sử dụng các udtt_ItemNames vào cửa hàng Thủ tục

CREATE PROCEDURE [dbo].[ReadItemData](@ItemNames udtt_ItemNames readonly,@TimeStamp as DATETIME) 

AS 

select * from ItemData 

where ItemName in (select Item from @ItemNames) AND [email protected] 

Vì vậy, bây giờ bạn cần phải vượt qua Bảng trong khi thực hiện các thủ tục lưu trữ.

4

Tôi nhận ra đây là một câu hỏi cũ, nhưng vấn đề mà tôi thấy không phải là giới hạn của trường, mà là cú pháp. Vấn đề là thủ tục được lưu trữ không xử lý tham số như một chuỗi được chèn vào văn bản SELECT, nhưng theo nghĩa đen là tìm kiếm sự hiện diện của chuỗi 1M + trong trường của bạn. Có một vài cách để giải quyết vấn đề này.

Trước tiên, bạn có thể xây dựng các SQL động trong một biến, và sau đó chạy nó như thế này:

DECLARE @SQL as nvarchar(max) 
SET @SQL = 'SELECT * FROM ItemData WHERE ItemName in (' + @ItemsNames + ')' 
     + ' AND TimeStamp = ''' + @TimeStamp + '''' 
EXEC (@SQL) 

Tuy nhiên, đây vẫn sẽ thất bại, bởi vì @ItemNames đã nhúng dấu ngoặc kép trong nó, làm cho SQL kết quả không hợp lệ.Bạn có thể thay đổi @ItemNames bằng:

REPLACE(@ItemNames, '''', '''''') 

nhưng tôi chưa thử nghiệm điều này. Ý tưởng ở đây là bạn đang viết một dấu nháy đơn ('') trong văn bản chuỗi để gửi một dấu nháy đơn (') tới bộ xử lý truy vấn. Hàm REPLACE ở trên là tìm kiếm bên trong văn bản cho bất kỳ dấu nháy đơn nào và thay thế chúng bằng hai dấu nháy đơn.

Một giải pháp mạnh mẽ hơn sẽ tạo ra một hàm bảng giá trị Split, sau đó thay đổi điều khoản trong bạn với một cái gì đó như:

WHERE ItemName IN (SELECT SplitText FROM dbo.Split(@ItemNames)) 

Tôi giả định rằng bạn đang chăm sóc các dấu ngoặc kép nhúng trong Split chức năng. Tôi không khuyên bạn chỉ cần loại bỏ dấu ngoặc kép với một REPLACE, vì các dấu ngoặc kép có thể bảo vệ dấu phẩy trong giá trị chuỗi.

Các vấn đề liên quan