--注意一:用此方法替代游标的方法,可以提高性能 --注意二:只有使用全局临时表(##MYTALE),才能在动态语句和静态语句中配合使用, --如下语句改为#MYTALE将报:"对象名 '#MYTALE' 无效。"的错误信息 DECLARE @S VARCHAR(8000),@SQL NVARCHAR(4000) SET @S='A;B;C;D;E;F;G;H;I;J;K' SET @SQL='SELECT '''+ REPLACE(@S,';',''' COL UNION ALL SELECT ''')+''' COL' PRINT @SQL SET @SQL='SELECT * INTO ##MYTALE FROM ('+@SQL+') T' PRINT @SQL EXEC SP_EXECUTESQL @SQL SELECT COL FROM ##MYTALE DROP TABLE ##MYTALE
--以下方式也用与解决动态语句和静态语句共享临时表的一种方法 DECLARE @S VARCHAR(8000),@SQL NVARCHAR(4000) CREATE TABLE #MYTALE (COL NVARCHAR(20)) SET @S='A;B;C;D;E;F;G;H;I;J;K' SET @SQL='SELECT '''+ REPLACE(@S,';',''' COL UNION ALL SELECT ''')+''' COL' PRINT @SQL SET @SQL='INSERT INTO #MYTALE SELECT * FROM ('+@SQL+') T' PRINT @SQL EXEC SP_EXECUTESQL @SQL SELECT COL FROM #MYTALE DROP TABLE #MYTALE
--注意一:使用表变量千万不能使用DROP TABLE @MYTALE语句,因为表变量的生命周期就跟定义的字段一样 --注意二:动态语句中无法使用到动态语句外面定义的变量,除非是全局的,而全局的又只能使用## DECLARE @S VARCHAR(8000),@SQL NVARCHAR(4000) DECLARE @MYTALE TABLE(COL NVARCHAR(20)) SET @S='A;B;C;D;E;F;G;H;I;J;K' SET @SQL='SELECT '''+ REPLACE(@S,';',''' COL UNION ALL SELECT ''')+''' COL' PRINT @SQL SET @SQL='INSERT INTO @MYTALE SELECT * FROM ('+@SQL+') T' PRINT @SQL EXEC SP_EXECUTESQL @SQL SELECT COL FROM @MYTALE --DROP TABLE @MYTALE
--以下方式无误 DECLARE @MYTALE TABLE(COL NVARCHAR(20)) BEGIN INSERT INTO @MYTALE SELECT * FROM (SELECT 'A' COL UNION ALL SELECT 'B' COL UNION ALL SELECT 'C' COL UNION ALL SELECT 'D' COL UNION ALL SELECT 'E' COL UNION ALL SELECT 'F' COL UNION ALL SELECT 'G' COL UNION ALL SELECT 'H' COL UNION ALL SELECT 'I' COL UNION ALL SELECT 'J' COL UNION ALL SELECT 'K' COL) T SELECT * FROM @MYTALE END |
|