声明一个等于''(空字符串)

时间:2015-10-28 18:33:39

标签: sql-server string variables

是否可以声明长度为0的固定长度字符串变量?用例用于动态SQL生成。

我马上就有几个gimmes
declare 
    @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

1 个答案:

答案 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声明为VARCHARNVARCHAR(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