none
动态SQL中 insert into select 字段值是变量时,变量是字符会出错:列名无效 RRS feed

  • 问题

  • 例如:

    set @sql='insert into table1 (test1,test2,test3) select test01,test02,'+ @test03 +' from table2'

    exec (@sql)

    当@test03 是数字时,能正常执行,当@test03 是数字加字符时,字符会被截断,当@test03 是字符串时,会出现列名无效。其中所有变量都是nvarchar类型。表中的字段都是varchar。

    变量用三个引号时,也能正常执行,如:

    set @sql='insert into table1 (test1,test2,test3) select test01,test02,'''+ @test03 +''' from table2'

    但是当后面有where子句,并且where子句:

    set @sql='insert into table1 (test1,test2,test3) select test01,test02,'''+ @test03 +''' from table2 where test01+'' ''+test02>(select max(test1) from table1'

    这时候就不能执行了。条件就是test01+空格+test02的值要大于test1

    test1,test2,test3是table1中的字段

    test01,test02,test03是table2中的字段

    这是什么原因?bug??

    win2003sp2+sql2005sp3,以上代码在sql2005中调试的,请各位达人指教,谢谢!

    2010年8月24日 10:24

答案

  • set @sql='insert into table1 (test1,test2,test3) select test01,test02,'''+ @test03 +''' from table2 where test01'+' '+'test02>(select max(test1) from table1)'

    字符串中的单引号用2个单引号表示

     

    2010年8月24日 11:09

全部回复

  • set @sql='insert into table1 (test1,test2,test3) select test01,test02,'''+ @test03 +''' from table2 where test01'+' '+'test02>(select max(test1) from table1)'

    字符串中的单引号用2个单引号表示

     

    2010年8月24日 11:09
  • 字符串要用单引号引起来,所以是你的语句没拼对, 不是BUG

    参考1楼的示例

    2010年8月24日 12:15
  • 楼主要是能把当后面加Where子句后不能执行报的错贴出来就好办多了,

    当后面有Where子句的时候,楼主的语句只有一个明显的问题,就是最后少了一个括号,其它基本对的

     

    set @sql='insert into table1 (test1,test2,test3) select test01,test02,'''+ @test03 +''' from table2 where test01+'' ''+test02>(select max(test1) from table1)'
    
    还有可能存在问题的地方就是test01+ ' ' +test02的时候,能确认一下这两个字段都是字符相关类型的么?

     

    2010年8月25日 1:28
  • @sql1 = 'INSERT INTO Event2010.dbo.['+@tablename+'] (EventDateTime,EventType,EventCategory,EventID,EventSource,EventUser,EventComputer,EventDescription,ComputerSN,EventName)
    select EventDate+'+''' '''+'+EventTime,EventType,EventCategory,EventID,EventSource,EventUser,EventComputer,EventDescription,''' + @tablename + ''',''' + @EventName + '''
    from Event2010.dbo.EventTmp
    where cast(EventDate+'+''' '''+'+EventTime as datetime) > (select max(EventDateTime) from Event2010.dbo.[99WDMT6])'
    在第一次相加的时候是正确的,EventDateTime是datetetime类型,EventDate和EventTime是字符,转换正确,但是在where里面,同样的写法就不行啦,没办法录入数据,去掉where字句就可以了
    2010年8月25日 2:34
  • 请查看一下这篇文章http://hi.baidu.com/jinwb/blog/item/ed65b8019959250a728da5df.html

    动态变量在SQL2000中应该使用三个单引号 所以你的代码:'+ @test03 +'  应改为'''+@test03+'''

    顺便提示下:在SQL05中像你以前那样可以

    2010年8月28日 12:56
  •  @test03 是table2的一个列名,还是变量值当然常量?

    如果是传值那直接都加上引号,即使Table1当前列是数值,也可以隐式转换


    More: blog.csdn.net/happyflystone
    2010年8月29日 11:28