我试图简化以下sql查询,由于while循环需要更多时间。
DECLARE @TEMP TABLE
(
ID NUMERIC(18,0) IDENTITY (1, 1) PRIMARY KEY NOT NULL,
NAME VARCHAR(1000),
CATEGORY_ID INT,
TYPE1 VARCHAR(100),
VALUE VARCHAR(6000),
TYPE2 VARCHAR(100)
)
INSERT INTO @TEMP
SELECT
NAME ,
A.CATEGORY_ID,
A.TYPE1,
A.VALUE,
A.TYPE2
FROM
DBO.TABLE1 A,
DBO.TABLE2 B
WHERE
A.CATEGORY_ID=B.CATEGORY_ID
ORDER BY A.CATEGORY_ID
DECLARE @ROWCNT INT=1 , @ROWS INT=0 , @NAME VARCHAR(100),@TYPE1 VARCHAR(100)
,@STAT CHAR(1)='Y'
, @VALUE VARCHAR(6000)
,@COND VARCHAR(8000)
, @TYPE2 VARCHAR(100)
SELECT @COND='SELECT * FROM TABLE3 '
SELECT @ROWCNT = @ROWCNT , @ROWS = (@ROWCNT-1)+ COUNT(1) FROM @TEMP
WHILE @ROWCNT <= @ROWS
BEGIN
SELECT @NAME = NAME ,
@TYPE1 = LTRIM(RTRIM(TYPE1)) ,
@VALUE = VALUE,
@TYPE2 = ISNULL(TYPE2,'')
FROM @TEMP WHERE ID = @ROWCNT
IF @STAT='Y'
BEGIN
IF @TYPE1 = 'SQL'
BEGIN
SELECT @COND=@COND + ' A'+'.'+(@NAME)+' '+@TYPE1+ ' ('''+@VALUE+''') '+@TYPE2+' '+CHAR(13)
END
ELSE
BEGIN
SELECT @COND=@COND + ' A'+'.'+(@NAME)+' '+@TYPE1+ ''''+@VALUE+''' '+@TYPE2+' '++CHAR(13)
END
END
SELECT @ROWCNT=@ROWCNT+1;
END
PRINT (@COND)
重要的是替换while循环而不是CTE或其他东西。 任何人都可以解决这个问题。谢谢提前
答案 0 :(得分:2)
看起来你需要类似下面的内容。
DECLARE @COND VARCHAR(8000) ='SELECT * FROM TABLE3 '
+ (SELECT ' A' + '.' + NAME + ' ' + LTRIM(RTRIM(TYPE1))
+ CASE
WHEN LTRIM(RTRIM(TYPE1)) = 'SQL' THEN ' (''' + VALUE + ''') '
ELSE VALUE
END
+ ISNULL(TYPE2, '') + ' ' + CHAR(13)
FROM @TEMP
ORDER BY ID
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(8000)');
PRINT @COND
生成的字符串不是有效的SQL