积极答复者
动态SQL中 insert into select 字段值是变量时,变量是字符会出错:列名无效

问题
-
例如:
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中调试的,请各位达人指教,谢谢!
答案
-
set @sql='insert into table1 (test1,test2,test3) select test01,test02,'''+ @test03 +''' from table2 where test01'+' '+'test02>(select max(test1) from table1)'
字符串中的单引号用2个单引号表示
- 已标记为答案 Nai-dong Jin - MSFTModerator 2010年8月30日 5:18
全部回复
-
set @sql='insert into table1 (test1,test2,test3) select test01,test02,'''+ @test03 +''' from table2 where test01'+' '+'test02>(select max(test1) from table1)'
字符串中的单引号用2个单引号表示
- 已标记为答案 Nai-dong Jin - MSFTModerator 2010年8月30日 5:18
-
楼主要是能把当后面加Where子句后不能执行报的错贴出来就好办多了,
当后面有Where子句的时候,楼主的语句只有一个明显的问题,就是最后少了一个括号,其它基本对的
set @sql='insert into table1 (test1,test2,test3) select test01,test02,'''+ @test03 +''' from table2 where test01+'' ''+test02>(select max(test1) from table1)'
-
@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字句就可以了