CRLF序列作为存储过程中的默认参数值

时间:2014-08-19 19:41:14

标签: sql-server tsql stored-procedures

我希望SQL Server 2008中的存储过程具有为其中一个参数指定的默认值。我希望这个值是一个CRLF序列。显然,SQL Server不允许我这样做:

CREATE PROCEDURE SomeProc
   @arg1 nvarchar(2) = CHAR(13) + CHAR(10),
   @arg2
...

我知道我可以简单地将这个序列写成:

CREATE PROCEDURE SomeProc
   @arg1 nvarchar(2) = '
',
   @arg2
...

但似乎......不太正确。如果我通过电子邮件将此脚本发送给某人并且CRLF转换为LF,该怎么办?还是偶然添加了一些空间?或者最后,如果我想要一些其他序列(让它成为任何Unicode字符)怎么办?

使用变量来存储默认值不是一个选项,因为没有地方可以声明和初始化变量,因为CREATE PROCEDURE必须是批处理中的第一个语句。

在语句字符串上使用EXEC显然太麻烦了。

有没有更好的方法允许不可打印的ASCII / Unicode字符序列作为存储过程参数的默认值?

1 个答案:

答案 0 :(得分:1)

这个怎么样:

CREATE PROCEDURE dbo.SomeProc
   @arg1 nvarchar(2) =  0x0D000A00 --CHAR(13) + CHAR(10)

运行以下代码会返回“相等”:

CREATE PROCEDURE dbo.SomeProc
   @arg1 nvarchar(2) =  0x0D000A00 
AS    
declare @v nvarchar(2) = CHAR(13) + CHAR(10)

IF @arg1 = @v
select 'is equal'
ELSE
select 'is not equal'
GO

EXEC dbo.SomeProc

要计算出你应该使用的十六进制序列,你可以这样做:

declare  @arg1 nvarchar(2) = CHAR(13) + CHAR(10)
select cast(@arg1 as varbinary(max))

返回:

0x0D000A00