0

中不接受換行符我試圖把逗號分隔值作爲參數存儲過程,但是當我按下「Enter」鍵來繼續這些值,以便它可以在單個屏幕中看到(不滾動),SP不接受其之後提供的值「回車」鍵被按下時在新行(單元)存儲過程在參數

USP_SAMPLE_SP @YEAR, @EMPIDS 

如果我執行存儲如下程序:

USP_SAMPLE_SP '2016','111,222,333,444,555' 

它正在執行正確

但是,如果我試圖執行象下面這樣:

USP_SAMPLE_SP '2016','111,222, 
333,444,555' 

它接受所有值但它顯示值達到「222」之後,它是不考慮任何價值。

參照「換行」我的意思是它是接受象下面這樣:

USP_SAMPLE_SP '2016','111,  222,333,444,555' 

但是,如果我按「回車」這之後

不接受值。如果任何人能解釋這情景會有所幫助。

注意:有時我需要傳遞大量值(例如1000或更高)。

請建議是否有人知道更好和有效的方法來做到這一點。

首先我創建用戶定義的表類型爲的empType

CREATE TYPE [dbo].[EMPType] AS TABLE(
     FinStartYear varchar(4), 
     EmpId nvarchar(max) NULL 
) 

然後我試圖通過爲改變我的存儲過程,如下這些值:

ALTER PROCEDURE [USP_SAMPLE_SP] 
-- Add the parameters for the stored procedure here 
    @FinStartYear EMPType readonly , 
@EmpIDs EMPType readonly 

AS 

但是,當我將鼠標懸停鼠標超過參數它顯示我下面的錯誤:

The Parameter '@FinStartYear' cannot be declared READONLY since it is not table valued parameter. 

The Parameter '@EmpIDs' cannot be declared READONLY since it is not table valued parameter. 

但是當我試圖人之三的存儲過程,它顯示如下錯誤我:

Must declare the scalar variable "@EmpIDs". 
    Must declare the scalar variable "@FinStartYear" 

當我將鼠標懸停在「的empType」它讓我看到下面的錯誤:

Parameter or variable '@FinStartYear' has an invalid datatype. 

注:在可編程 - >類型 - >用戶定義表類型 - > dbo.EMPType

它顯示我已經創建了EMPType。

回答

0

沒有看到存儲過程的代碼是不可能的,但我懷疑換行符會以某種方式破壞用於將分隔字符串拆分爲結果集的代碼;換行符將被解釋爲終止符,並且後面的所有值都將被忽略。

有幾種可能的解決方案。

一種方法是從一系列較短的字符串構建輸入值列表,使您能夠控制列表在屏幕上的顯示方式,而不會影響其內容。請注意,這需要使用一個變量:

-- I am guessing the data type of the @EMPIDS parameter. Use a matching type for @IDS 
DECLARE @IDS VARCHAR(MAX) = '111,222,'  
          + '333,444,555' 

EXEC USP_SAMPLE_SP @YEAR = '2016', @EMPIDS = @IDS 

另一個辦法是分裂分隔列表前修改存儲過程來去掉換行字符的代碼。我不會推薦這一點,因爲這種行爲可能會被代碼的其他用戶所依賴。


編輯

這裏有一個如何替換換行符的例子:

DECLARE @EMPID varchar(100) = '111,222, 
333,444,555' 

SET @EMPID = REPLACE(REPLACE(@EMPID,CHAR(13),''),CHAR(10),'') 

SELECT @EMPID 

您使用此之前,請確保您不會影響本的其他用戶可能依賴於當前行爲的代碼。


另一種解決方案是修改存儲過程以接受table-valued parameter而不是分隔列表。這比設置分割字符串更復雜一些,但可能比分割字符串更好,特別是如果字符串包含數千個值。


編輯2

我想你可能誤會了表值參數是如何工作的。它使您可以完全避免EMPID的連接列表,而是使用包含每行一個EMPID的表變量,這些變量可以作爲參數傳遞給存儲過程。

這裏有一個工作例如:

CREATE TYPE dbo.EMPType AS TABLE(
     EmpId int NOT NULL PRIMARY KEY 
) 
GO 

-- I don't know what your procedure does so I've created a simple stub 
-- which shows how to use the table-valued parameter like a table 
CREATE PROCEDURE dbo.USP_SAMPLE_SP 
    @FinStartYear varchar(4), 
    @empids EMPType readonly 
AS 
    SELECT @FinStartYear AS out_year, EmpId 
    FROM @empids 
    ORDER BY EmpId 
GO 

-- use the code from here to the end of the example every time 
-- you want to execute the procedure (setting the list of EMPID values appropriately 
DECLARE @in_emp EMPType --declare an instance of EMPType as a variable 

INSERT @in_emp(EmpId) VALUES (111),(333),(222),(555),(444) --insert some values into the variable 

EXEC dbo.USP_SAMPLE_SP @FinStartYear = '2016',@empids = @in_emp --pass the variable as a parameter to the stored procedure 
GO 
+0

謝謝...你能告訴我如何刪除字符串中的換行符。 – Shardul

+0

其實我正在使用SplitString函數,並將@EMPIDS參數傳遞給它。 我嘗試過使用LTRIM和RTRIM函數,但它不起作用 – Shardul

+0

@Shardul - 查看我的更新。 SplitString不是內置SQL Server函數的名稱,所以如果沒有看到代碼,就不可能知道它的行爲。 –