0

我有一个这样的sql语句:

DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)

在这种情况下,$(TokenValue)将填写表单中的值(忽略它是如何做到的,这并不重要,只是如果在与之相关的字段中有一个值,它将被填写在那里)。但是,如果表单中的字段留空,则不会有任何内容,最终结果如下:

DECLARE @MyVariable as varchar(50)
SET @MyVariable = 

而不是

DECLARE @MyVariable as varchar(50)
SET @MyVariable = 'FormInputValue'

由于 = 之后没有任何内容,我该如何解释这一点并确保 SQL 语句不会崩溃?令牌永远不会将 null 写入它的位置,如果该字段为空,则始终只是一个空白......有什么想法吗?

谢谢,
马特

4

3 回答 3

1

您可以尝试使用默认参数,例如

create PROCEDURE dbo.test
    @v varchar(50) = ''
AS
BEGIN
    select @v
END
GO

进而

declare @a table (v varchar(50))

insert into @a
exec dbo.test -- that represents scenario with no token

insert into @a
exec dbo.test 'blah' -- that if there is a token

select * from @a

所以在你的情况下,而不是

DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)

你最终会得到

DECLARE @MyVariable as varchar(50)
declare @a table (v varchar(50))
insert into @a
exec dbo.test  $(TokenValue)
select @myVariable = v from @a

但这确实是一个hacky解决方案。正如其他人建议的那样,它应该在应用程序级别进行过滤

于 2009-12-09T16:26:47.690 回答
0

恐怕您将无法绕过这一点。

这是应该在应用程序级别处理的事情。

如果 $(TokenValue) 不是参数,并且您没有在字符串值中包含 ' 您可以尝试使用

SET @MyVariable = '$(TokenValue)'

这不适用于所有 var 类型(INT 和 FLOAT 有效,但不是十进制)

--WORKS
DECLARE @MyVariable as INT
SET @MyVariable = ''
SELECT @MyVariable
--WORKS
DECLARE @MyVariable as FLOAT
SET @MyVariable = ''
SELECT @MyVariable
--DOES NOT WORK
DECLARE @MyVariable as DECIMAL(18,8)
SET @MyVariable = ''
SELECT @MyVariable
于 2009-12-09T16:05:43.920 回答
0

为 SQL Server 编辑 :) 如果您这样编写查询:

set @MyVariable = ''$(TokenValue)''
if @MyVariable = ''''
    set @MyVariable = null
else
    set @MyVariable = substring(@MyVariable,2,len(@MyVariable)-2)

如果没有任何东西代替$(TokenValue),你会得到:

if '''' = ''''

并且 @MyVariable 将设置为NULL. 如果在 的地方有一个字符串$(TokenValue),你会得到:

if '''teststring''' = ''''
     ^^^^^^^^^^^^

因为''是转义单引号的方法,所以每个引号都会''在@MyVariable 中产生一个引号。substring这两个引号被inelse子句去掉了。

于 2009-12-09T16:09:48.160 回答