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函数的名称,所以如果没有看到代码,就不可能知道它的行为。 –