我正在尝试编写一个快速实用程序来帮助我生成用于编写其他 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 ...不。我已经为此工作了一段令人尴尬的时间。任何帮助表示赞赏。