是否可以声明长度为0的固定长度字符串变量?用例用于动态SQL生成。
我马上就有几个gimmesdeclare
@SqlQuery nvarchar( max ) = '',
@lb nchar( 1 ) = char( 10 ),
@tab nchar( 1 ) = char( 9 ),
@sq nchar( 1 ) = char( 39 ), -- single quote
@dq nchar( 2 ) = char( 39 ) + char( 39 ) -- 2x single quote
为了提高proc的可读性,我想为@es
清理包含一个“空字符串”变量isnull( Column, @es )
,所以我不会在null
值上断开连接。但是,我没有取得多大成功。试图在下面。有什么见解吗?
go
declare @EmptyString char( 0 ) = '' ;
print 'empty string [' + @EmptyString + ']';
--Msg 1001, Level 15, State 1, Line 1
--Line 1: Length or precision specification 0 is invalid.
go
declare @EmptyString char( 1 ) = '' ;
print len( @EmptyString ); --0
print '[' + replicate( @EmptyString, 10 ) + ']'; --[ ]
go
答案 0 :(得分:4)
您不能声明最大长度为0的字符串变量或字段(至少不在SQL Server中)。鉴于此限制,定义为CHAR
/ NCHAR
的固定长度数据类型不能包含空字符串,因为最小长度为1并且始终为空白填充。
len( @EmptyString )
显示为0
的原因是因为删除了尾随空格以进行比较。如果您还要尝试print datalength( @EmptyString );
,您会看到它会返回1
,这会占用空间。如果您要将declare @EmptyString char( 1 )
更改为NCHAR(1)
,那么DATALENGTH(@EmptyString)
将返回2
,即使LEN
函数仍会返回0。
'[' + replicate( @EmptyString, 10 ) + ']'
生成[ ]
的原因是因为空白填充的CHAR(1)
实际上不是空的,即使设置为''
,所以真实地复制了一个太空人物10次。
获取空字符串的唯一方法是使用NVARCHAR(x) = N''
。虽然x
在技术上可以是1 - 4000甚至MAX
的值,但为此目的,它可能只是1
。即使NVARCHAR
声明为VARCHAR
,NVARCHAR(100)
/ DECLARE @EmptyString NVARCHAR( 10 ) = N'';
PRINT LEN( @EmptyString ); -- 0
PRINT DATALENGTH( @EmptyString ); -- 0
PRINT '[' + REPLICATE( @EmptyString, 10 ) + ']'; -- []
的变量性质也会为您提供一个空字符串。
以下显示这确实有效:
class Categorie(models.Model):
name = models.CharField(max_length=30)
visible = models.BooleanField(default = False)
def __str__(self):
return self.nom
def getscateg(self):
return self.souscategorie_set.all().filter(visible = True)
class SousCategorie(models.Model):
name = models.CharField(max_length=30)
visible = models.BooleanField(default = False)
categorie = models.ForeignKey('Categorie')
def __str__(self):
return self.name
def gettheme(self):
return self.theme_set.all().filter(visible = True)
class Theme(models.Model):
name = models.CharField(max_length=100)
visible = models.BooleanField(default = False)
souscategorie = models.ForeignKey('SousCategorie')
def __str__(self):
return self.name