我正在尝试编写一个快速实用程序来帮助我生成编写其他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为 varchar(5))。如果我用字符串常量替换它,它可以工作,但除了常量之外的任何类型的表达式都不起作用。 它打印"完成"消息,但不打印第一个消息 - 甚至没有尖括号。 我尝试在它周围放置一个尝试捕获并打印错误消息 - 没有消息。 我想也许它使用了某种我不知道的空 dlen 类型......不。 我已经为此工作了令人尴尬的时间。 任何帮助表示赞赏。
为什么我的原始解决方案不起作用,但我确实找到了一种不同的方法来通过替换集合来做到这一点,如下所示:
集合 @vardefstring4 = @vardefstring4 + (当 @dlen 为 null 时,则@dtype ELSE @dtype + '(' + cast (@dlen为 varchar(5
)) + ')' 结束) + ', '这样做的好处是它确实有效(而且我更喜欢逻辑)。