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 回答