22,210
社区成员
发帖
与我相关
我的任务
分享
DECLARE @TB TABLE (id INT,name NVARCHAR(10))
INSERT @TB
SELECT 1 ,'jack' UNION ALL
SELECT 2 ,'sam' UNION ALL
SELECT 6 ,'micle' UNION ALL
SELECT 7 ,'Jop' UNION ALL
SELECT 7 ,'Jop' UNION ALL
SELECT 12, 'Nill'
declare @s varchar(50)
set @s=''
SELECT @S=@S+NAME FROM @TB
SELECT @S
SET @S=''
SELECT DISTINCT @S=@S+NAME FROM @TB
SELECT @S
SET @S=''
SELECT DISTINCT @S=NAME FROM @TB
SELECT @S
/*
(所影响的行数为 6 行)
--------------------------------------------------
jacksammicleJopJopNill
(所影响的行数为 1 行)
--------------------------------------------------
sam
(所影响的行数为 1 行)
--------------------------------------------------
sam
(所影响的行数为 1 行)
*/
DECLARE @TB TABLE (id INT,name NVARCHAR(10))
INSERT @TB
SELECT 1 ,'jack' UNION ALL
SELECT 2 ,'sam' UNION ALL
SELECT 6 ,'micle' UNION ALL
SELECT 7 ,'Jop' UNION ALL
SELECT 7 ,'Jop' UNION ALL
SELECT 12, 'Nill'
declare @s varchar(50)
set @s=''
SELECT DISTINCT @S=@S+NAME FROM @TB
SELECT @S
重点看这个sql的执行情况,其它两个很好理解;此sql的实际执行文本为(set SHOWPLAN_TEXT on)
------------------------------------------------------------------------------------------------
|--Compute Scalar(DEFINE:([Expr1005]=CONVERT_IMPLICIT(varchar(50),[Expr1004],0)))
|--Sort(DISTINCT ORDER BY:([Expr1004] ASC))
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(nvarchar(50),[@s],0)+[name]))
|--Table Scan(OBJECT:(@TB))
这个执行顺序是
select @s+name from @tb(这里的@s='',这里没有赋值,而且@s并没有保存name的值,只是做了一个"+"运算,执行完的结果其它就是原表@tb的结果,下两步就是排序和循环赋值)----->排序--->再把最后一个值赋值给@s