2013-03-02 73 views
1

我從我的ASP.NET應用程序調用存儲過程。存儲過程需要一個參數。我從我的WEB窗體提供的值太大,以至於沒有完全加載到sql server的變量中。我的sql服務器參數的數據類型是nvarchar(max),我的ASP.NET應用程序中的數據類型是字符串。 存儲過程爲SQL服務器參數大小超載

Create procedure p_getProducts 
@nm_emp nvarchar(max) 
AS 
BEGIN 

    select * from tblProduct where nm_user in(convert(nvarchar(max),@nm_emp)); 

END 

請告訴我哪SQL Server數據類型,我應該用它來解決這個問題。

謝謝。

+1

你爲什麼要將變量轉換成相同的數據類型? – 2013-03-02 13:30:32

+2

這裏有一個邏輯問題。以這種方式傳遞的參數不能將其自身擴展爲IN值的列表。你的查詢將永遠不會工作。 (至少在@nm_emp類似'joe','mark','steve'的情況下不行) – Steve 2013-03-02 13:37:46

+0

@steve,是的,我在c#中格式化了像'joe','mark','steve'這樣的值並保存變量並將其傳遞給存儲過程。他們工作得很好,但當參數文本的大小增加時,它會產生問題 – Candy 2013-03-02 13:42:07

回答

1

對於我可以從代碼中得到的結果,你應該使用dynamic-sql,而不是直接使用參數作爲IN子句的值。試試這個過程。

Create procedure p_getProducts 
     @nm_emp nvarchar(max) 
AS 
    BEGIN 
    DECLARE @SQL NVARCHAR(MAX); 
    SELECT @SQL = N'select * from tblProduct where nm_user in(' + 
        @nm_emp + N')' 

    EXEC sp_executeSQL @SQL 
+0

只要他的參數不超過約3960個Unicode字符。 :) – 2013-03-02 14:41:48

+0

如果他定義@SQL NVARCHAR(MAX),那麼他可以發佈更多我猜... – YvesR 2013-03-02 14:55:23

+0

@YvesR正確,更新 – Steve 2013-03-02 15:12:34