我希望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字符序列作为存储过程参数的默认值?
答案 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