1

このクエリがあります。すべての選択は技術的には同じで、乗数の値が増加するだけです。これは*64まで必要です。

私が今やっているよりも効率的な方法でこれを行う方法に関するアドバイスはありますか?

SELECT 
CONVERT(INT,cast(reverse(substring(char_data, 305+16*1, 2)) as BINARY(2))) AS inventory1,
CONVERT(INT,cast(reverse(substring(char_data, 305+16*2, 2)) as BINARY(2))) AS inventory2,
CONVERT(INT,cast(reverse(substring(char_data, 305+16*3, 2)) as BINARY(2))) AS inventory3,
CONVERT(INT,cast(reverse(substring(char_data, 305+16*4, 2)) as BINARY(2))) AS inventory4,
CONVERT(INT,cast(reverse(substring(char_data, 305+16*5, 2)) as BINARY(2))) AS inventory5,
CONVERT(INT,cast(reverse(substring(char_data, 305+16*6, 2)) as BINARY(2))) AS inventory6,
CONVERT(INT,cast(reverse(substring(char_data, 305+16*7, 2)) as BINARY(2))) AS inventory7,
CONVERT(INT,cast(reverse(substring(char_data, 305+16*8, 2)) as BINARY(2))) AS inventory8,
CONVERT(INT,cast(reverse(substring(char_data, 305+16*9, 2)) as BINARY(2))) AS inventory9,
CONVERT(INT,cast(reverse(substring(char_data, 305+16*10, 2)) as BINARY(2))) AS inventory10
    ..........SO ON TO 64.............
FROM CHAR_DATA0 
WHERE CHAR_KEY=10

みんなありがとう。

- 編集 -

私はMSSQLを使用しています

4

1 に答える 1

0

動的SQLなしではできないと思います

declare @stmt nvarchar(max), @i int

select @i = 1

while @i <= 64
begin
    select
        @stmt = 
            isnull(@stmt + ', ', '') + 
            'convert(int, cast(reverse(substring(char_data, 305+16*' + 
            cast(@i as nvarchar(10)) + ', 2)) as binary(2))) as inventory' + 
            cast(@i as nvarchar(10))

    select @i = @i + 1
end

select @stmt = 'select ' + @stmt + ' FROM CHAR_DATA0 WHERE CHAR_KEY=@CHAR_KEY'

exec dbo.sp_executesql
    @stmt = @stmt,
    @params = N'@CHAR_KEY int',
    @CHAR_KEY = 10
于 2012-11-21T18:07:59.703 に答える