2009-12-09 34 views
0

我有一个sql语句是这样的:令牌SQL语句填补空白,而不是NULL使其崩溃

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语句不会崩溃?令牌从不将空写入它的位置,如果该字段留空,总是只是一个空白......任何想法?

谢谢
马特

+0

结果是,如果我在标记周围加上引号,如下所示:SET @MyVariable ='$(TokenValue)'它的工作原理...作为空字符串出现什么都没有。我认为这只是与这些代币的工作方式有关,它们并不是那么好。 – Matt 2009-12-09 17:53:40

+0

原来的一些答案指出... – 2009-12-10 07:02:12

+0

是的,我发布评论后可以看到你的答案。感谢指出:) – Matt 2009-12-10 15:40:47

回答

0

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

这是应该在应用程序级别交付。

如果$(TokenValue)并非该PARAM,你不包括“的字符串值,你可以尝试使用

SET @MyVariable = '$(TokenValue)' 

这不是对所有的变种类型(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 
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一个报价。这两个引号被else条款中的substring剥离。

1

,你可以尝试用默认的参数e.g

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 

但这确实是一件很难解决的问题。 正如其他人建议它应该在应用程序层面上进行筛选

+0

+1肯定比我的答案少hacky;) – Andomar 2009-12-09 16:50:05