不同的查询方式

时间:2014-11-21 08:21:18

标签: c# sql sql-server

我在我的c#程序中写了一个查询,当我以这种方式键入它时它工作正常:

 query = " SELECT sa.f1 sort, fb.f5 dl, fa.f7 sh " +
         " FROM TC_OBJ2LINK with (nolock) " +
         " join tp_zag with (nolock) on tp_zag.f_key = f_obj_KEY " +
         " left join tp_zag_s sa with (nolock) on sa.f_parentkey = tp_zag.f_key and sa.f_row = 1 " +
         " left join tp_zag_f fa with (nolock) on fa.f_parentkey = tp_zag.f_key and fa.f_row = 1 " +
         " left join tp_zag_f fb with (nolock) on fb.f_parentkey = tp_zag.f_key and fb.f_row = 2 " +
         " WHERE F_OBJ_TYPE = 3 ";

但当我以这种方式编写时,它会返回无法与fa.f7绑定的错误:

query = @"
         SELECT sa.f1 sort, fb.f5 dl, fa.f7 sh
         FROM TC_OBJ2LINK with (nolock) 
         join tp_zag with (nolock) on tp_zag.f_key = f_obj_KEY 
         left join tp_zag_s sa with (nolock) on sa.f_parentkey = tp_zag.f_key and sa.f_row =1 
         left join tp_zag_f fa with (nolock) on fa.f_parentkey = tp_zag.f_key and fa.f_row = 1 
         left join tp_zag_f fb with (nolock) on fb.f_parentkey = tp_zag.f_key and fb.f_row = 2
         WHERE F_OBJ_TYPE = 3 ";

这2个查询有什么区别?为什么我在第二个查询中出错?

2 个答案:

答案 0 :(得分:2)

在第二个查询中,尽管您已经在多行中编写了查询,但它们之间没有任何空格,就像在第一个查询中一样。因此,您在第二个查询中有语法错误。当我们想要逐字编写字符串时,使用运算符@

正如here所述:

  

文字是你如何将字符串硬编码到C#程序中的。那里有两个   C#中的字符串文字类型 - 常规字符串文字和逐字   字符串文字。常规字符串文字类似于许多字符串文字   其他语言,如Java和C - 它们以“,和”开头和结尾   各种字符(特别是“本身,\和回车   (CR)和换行(LF))需要“转义”才能表示出来   串。逐字字符串文字几乎允许任何内容   他们,并在第一个结束时“没有加倍。甚至马车   返回和换行可以出现在文字中!获得“内部   字符串本身,你需要写“”。逐字字符串文字是   在开头报价之前加上@来区分。这里有一些   两种文字的例子,以及它们的含义:

您在代码方面遇到的错误如下:

SELECT sa.f1 sort, fb.f5 dl, fa.f7 sh
FROM TC_OBJ2LINK with (nolock) 

将被解释为

SELECT sa.f1 sort, fb.f5 dl, fa.f7 shFROM TC_OBJ2LINK with (nolock)

答案 1 :(得分:0)

你没有直接这样做,但我觉得你在这里问@。是的,它会为你处理转义,但你改变了整个字符串,并且没有要转义的字符。在这种情况下,尝试在屏幕上打印字符串并查看其实际值以解决这些谜团。