避免SQL Server过程参数中的隐式转换

避免SQL Server过程参数中的隐式转换,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个SQL: CREATE PROCEDURE PrintScreen @text as varchar(2000) AS BEGIN PRINT @text END GO EXEC PrintScreen @text = Hello --I want this sentence fail GO EXEC PrintScreen @text = 'Hello' go DROP PROCEDURE PrintScreen GO 为什么我可以用现在的引号

我有一个SQL:

CREATE PROCEDURE PrintScreen
       @text as varchar(2000)
AS
BEGIN
       PRINT @text
END
GO

EXEC PrintScreen @text = Hello    --I want this sentence fail
GO

EXEC PrintScreen @text = 'Hello'
go

DROP PROCEDURE PrintScreen
GO
为什么我可以用现在的引号调用PrintScreen过程


是否存在更改此行为的选项?

这是唯一一个将不带引号的字符串解释为字符串AFAIK的上下文。这里是明确的,但仍然有点不一致,我想这只是为了向后兼容。“如果参数的值是……字符串……则整个名称必须用单引号括起来。”。不要宣传如果没有嵌入空间,这不是必需的。似乎没有任何开关来改变这种行为。如:
如果我们可以回去重新开始,我们可能会采纳你的建议,使报价保持一致。不幸的是,这是非常广泛使用的遗留行为,出于兼容性原因需要维护。
顺便说一句,为什么要阻止这种行为?它真的引起了问题吗?Martin,我需要阻止其他过程中的调用,比如:创建过程SomeScreen@text作为varchar(2000)作为exec PrintScreen text是的,我们得到了,但是为什么?这会给你带来麻烦吗?还是你只是在审美上不满意?