我试图编写一个快速实用程序来帮助我生成编写其他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 ......不。我一直在努力工作,这是一段令人尴尬的时间。任何帮助表示赞赏。
答案 0 :(得分:0)
我不知道为什么我的原始解决方案不起作用,但我确实通过更换集合找到了不同的方法:
设置@ vardefstring4 = @ vardefstring4 +(@dlen为空时的情况,然后@dtype ELSE @dtype +'('+ cast(@dlen as varchar(5))+')'END)+','
这样做的好处是它确实有效(而且我更喜欢逻辑)。