【发布时间】:2016-01-31 15:03:52
【问题描述】:
我正在尝试创建一个需要 4 个参数的存储过程。这 4 个参数决定了返回表的外观。
@C_ID 参数始终为数字。 @U_ID 和 @P_ID 值可以包含有效的数值,或者可以(或应该)作为 NULL 传递,因此 WHERE 条件可以执行或不执行。
ALTER PROCEDURE [dbo].[GetData]
@C_ID integer,
@U_ID integer = Null,
@P_ID integer = Null,
@SortIndex integer = 1
AS
BEGIN
SELECT
ID, P_ID, U_Name, P_Name,
FORMAT(Date_When, 'dd/MM/yyyy hh:mm tt')
FROM
SomeTable
WHERE
C_ID = @C_ID
AND (@P_ID IS NULL OR P_ID = @P_ID)
AND (@U_ID IS NULL OR U_ID = @U_ID)
ORDER BY
CASE WHEN @SortIndex = 1 THEN -ID
ELSE ID
END ASC
END
在 SQL Server 2014 上,以下执行工作正常,没有任何错误:
exec GetData '15', null, null, '1';
exec GetData '15', '1', null, '1';
exec GetData '15', null, '1', '1';
exec GetData '15', '1', '1', '1';
...
但是在 C# 端,以下代码无法执行:
int? SomeValue = null;
Adapter = new SqlDataAdapter("exec GetData '15'," + SomeValue + ",null,'1';", Connection);
Adapter.Fill(Data);
这给了我一个错误
',' 附近的语法不正确。
如果我将 SomeValue 变量更改为 1,它就可以正常工作。
DBNull.Value 并将参数保留为 ' ' 也不起作用。
所以问题是:我如何(如果可能的话)能够将可为空的整数传递给 SQL,因为它既可以是 null 也可以是有效数字?
【问题讨论】:
-
至于你的问题的正式答案,这是因为
SomeValue,即null,在结果字符串中插入了一个空字符串,导致后面有两个逗号。
标签: c# sql sql-server