使用case语句对游标结果赋值给变量

时间:2013-01-24 20:31:49

标签: tsql casting cursor set fetch

我试图编写一个快速实用程序来帮助我生成编写其他SQL的东西 - 尤其是变量声明。输出不一定非常完美或完美(但是),但它必须足够接近我能够快速无痛地修复它。 (是的,我知道它并没有处理每一个案例。这是一个简单的案例来说明问题。)

use myDB

DECLARE @varcharflds table
(tname  varchar(50) not null, 
 fname  varchar(50) not null,
 dtype  varchar(50) not null,
 dlen   varchar(50) 
)

INSERT INTO @varcharflds
  SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH
     FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='myTable'

select * from @varcharflds
declare utable_cursor cursor FOR
select tname, fname, dtype, dlen from @varcharflds
open utable_cursor
Declare @tname varchar(50),@fname varchar(50), @dtype varchar(50), @dlen varchar(50)
Declare @vardefstring4 varchar(3000)
Set @vardefstring4 = ''        

Fetch Next from utable_cursor into @tname, @fname, @dtype, @dlen
WHILE @@FETCH_STATUS = 0
BEGIN
  print @dlen
  set @vardefstring4 = @vardefstring4 +
     (case WHEN @dtype in ('datetime', 'date', 'bit')
      THEN @dtype ELSE  '(' + cast (@dlen as varchar(5)) + ')' END) + ', '
   Fetch Next from utable_cursor into @tname, @fname, @dtype, @dlen
END

print '>' + @vardefstring4 + '<'
print 'done'

问题是读取强制转换的部分(@dlen为varchar(5))。如果我用字符串常量替换它,它可以工作,但除常量之外的任何表达都不起作用。它打印完成的&#39;消息,但第一个没有打印 - 甚至没有尖括号。我尝试在它周围试一试并打印错误信息 - 没有消息。我想也许它正在使用某种类型,我没有意识到空的dlen ......不。我一直在努力工作,这是一段令人尴尬的时间。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我不知道为什么我的原始解决方案不起作用,但我确实通过更换集合找到了不同的方法:

设置@ vardefstring4 = @ vardefstring4 +(@dlen为空时的情况,然后@dtype ELSE @dtype +'('+ cast(@dlen as varchar(5))+')'END)+','

这样做的好处是它确实有效(而且我更喜欢逻辑)。