0

我正在尝试编写一个快速实用程序来帮助我生成用于编写其他 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'

问题是读取 cast (@dlen as varchar(5)) 的部分。如果我用字符串常量替换它,它可以工作,但除常量之外的任何类型的表达式都不起作用。它打印“完成”消息,但不打印第一个消息 - 甚至不打印尖括号。我尝试在它周围放置一个 try catch 并打印一条错误消息 - 没有消息。我想也许它使用了一些我不知道的类型和空 dlen ...不。我已经为此工作了一段令人尴尬的时间。任何帮助表示赞赏。

4

1 回答 1

0

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

set @vardefstring4 = @vardefstring4 + (@dlen 为空的情况 THEN @dtype ELSE @dtype + '(' + cast (@dlen as varchar(5)) + ')' END) + ', '

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

于 2013-01-24T20:56:32.167 回答