SQL语句的标记将填充为空,而不是NULL,从而使其崩溃
我有这样一个sql语句:SQL语句的标记将填充为空,而不是NULL,从而使其崩溃,sql,sql-server,token,dotnetnuke,Sql,Sql Server,Token,Dotnetnuke,我有这样一个sql语句: DECLARE @MyVariable as varchar(50) SET @MyVariable = $(TokenValue) DECLARE @MyVariable as varchar(50) SET @MyVariable = set @MyVariable = ''$(TokenValue)'' if @MyVariable = '''' set @MyVariable = null else set @MyVariable = su
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
DECLARE @MyVariable as varchar(50)
SET @MyVariable =
set @MyVariable = ''$(TokenValue)''
if @MyVariable = ''''
set @MyVariable = null
else
set @MyVariable = substring(@MyVariable,2,len(@MyVariable)-2)
在这种情况下,$(TokenValue)
将从表单中填写一个值(忽略它是如何完成的,这并不重要,只是如果字段中有一个与之相关的值,它将在那里被填写)。但是,如果表单中的字段保留为空,则不会在其中放置任何内容,最终结果如下:
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
DECLARE @MyVariable as varchar(50)
SET @MyVariable =
set @MyVariable = ''$(TokenValue)''
if @MyVariable = ''''
set @MyVariable = null
else
set @MyVariable = substring(@MyVariable,2,len(@MyVariable)-2)
而不是
DECLARE @MyVariable as varchar(50)
SET @MyVariable = 'FormInputValue'
既然在=,之后没有任何内容,我如何解释这一点并确保SQL语句不会崩溃?令牌从不将null写入其位置,如果字段为空,则始终为空。。。有什么想法吗
谢谢,
马特恐怕你无法绕过这个问题 这是应该在应用程序级别提交的内容 如果$(TokenValue)不是参数,并且您没有在字符串值中包含',则可以尝试使用
SET @MyVariable = '$(TokenValue)'
这不适用于所有变量类型(INT和FLOAT有效,但不适用于decimal)
为SQL Server编辑:)如果您这样编写查询:
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
DECLARE @MyVariable as varchar(50)
SET @MyVariable =
set @MyVariable = ''$(TokenValue)''
if @MyVariable = ''''
set @MyVariable = null
else
set @MyVariable = substring(@MyVariable,2,len(@MyVariable)-2)
如果$(TokenValue)
中没有任何内容,您将获得:
if '''' = ''''
if '''teststring''' = ''''
^^^^^^^^^^^^
@MyVariable将被设置为NULL
。如果在$(TokenValue)
的位置有一个字符串,您将得到:
if '''' = ''''
if '''teststring''' = ''''
^^^^^^^^^^^^
因为
'
是转义单个引号的方法,所以每个'
都会在@MyVariable中产生一个引号。这两个引号被else
子句中的子字符串删除。您可以尝试使用默认参数,例如
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
但这确实是一个令人讨厌的解决方案。
正如其他人所建议的,应该在应用程序级别对其进行过滤结果是,如果我在标记周围加上引号,如下所示:SET@MyVariable='$(TokenValue)'它可以工作。。。作为空字符串而不是空字符串出现。我认为这只是与这些代币的工作方式有关,它们并不都那么好。事实证明,一些答案确实指明了……是的,我可以看到你的答案在我发表评论后是这样做的。谢谢你指出:)