Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL语句的标记将填充为空,而不是NULL,从而使其崩溃_Sql_Sql Server_Token_Dotnetnuke - Fatal编程技术网

SQL语句的标记将填充为空,而不是NULL,从而使其崩溃

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

我有这样一个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 = 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)'它可以工作。。。作为空字符串而不是空字符串出现。我认为这只是与这些代币的工作方式有关,它们并不都那么好。事实证明,一些答案确实指明了……是的,我可以看到你的答案在我发表评论后是这样做的。谢谢你指出:)