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を配置して、エラーメッセージを出力しようとしました-メッセージはありません。null dlenで認識していないタイプを使用している可能性があると思いました...いいえ。私は恥ずかしいほど長い間これに取り組んできました。どんな助けでも感謝します。

4

1 に答える 1

0

元のソリューションが機能しない理由はわかりませんが、次のようにセットを置き換えることで別の方法を見つけました。

set @vardefstring4 = @vardefstring4 + (@dlen が null の場合 THEN @dtype ELSE @dtype + '(' + キャスト (@dlen as varchar(5)) + ')' END) + ', '

そして、これには実際に機能するという利点があります (そして、私はロジックの方が好きです)。

于 2013-01-24T20:56:32.167 に答える