34,590
社区成员
发帖
与我相关
我的任务
分享
DECLARE @T TABLE (id INT,data VARCHAR(100))
INSERT INTO @T
SELECT 1,'2009-1-7,2009-2-3,2009-3-7' UNION ALL
SELECT 2,'2009-4-4,2009-5-6,2009-7-12' UNION ALL
SELECT 3,'2009-2-4,2009-1-7'
SELECT *
FROM @T
WHERE CHARINDEX(REPLACE(CONVERT(VARCHAR(10),GETDATE(),120),'-0','-'),','+data+',')>0
/*
id data
----------- ----------------------------------------------------------------------------------------------------
1 2009-1-7,2009-2-3,2009-3-7
3 2009-2-4,2009-1-7
(2 行受影响)
*/
DECLARE @T TABLE (id INT,data VARCHAR(100))
INSERT INTO @T
SELECT 1,'2009-1-7,2009-2-3,2009-3-7' UNION ALL
SELECT 2,'2009-4-4,2009-5-6,2009-7-12' UNION ALL
SELECT 3,'2009-2-4,2009-1-7'
SELECT *
FROM @T
WHERE CHARINDEX(RTRIM(YEAR(GETDATE()))+'-'+RTRIM(MONTH(GETDATE()))+'-'+RTRIM(DAY(GETDATE())),
','+data+',')>0
/*
id data
----------- ----------------------------------------------------------------------------------------------------
1 2009-1-7,2009-2-3,2009-3-7
3 2009-2-4,2009-1-7
(2 行受影响)
*/
---------------------------------
-- Author: liangCK 小梁
---------------------------------
--> 生成测试数据: @T
DECLARE @T TABLE (data VARCHAR(100))
INSERT INTO @T
SELECT '2009-1-4,2009-2-3,2009-3-7' UNION ALL
SELECT '2009-4-4,2009-5-6,2009-7-12' UNION ALL
SELECT '2009-2-4,2009-4-3'
--SQL查询如下:
--2005
;WITH Liang AS
(
SELECT
RID=ROW_NUMBER() OVER(ORDER BY GETDATE()),
data
FROM @T
),
Liang2 AS
(
SELECT
A.RID,
data=B.x.value('.','varchar(10)')
FROM (
SELECT
RID,
CONVERT(XML,'<v>'+REPLACE(data,',','</v><v>')+'</v>') AS data
FROM Liang
) AS A
CROSS APPLY A.data.nodes('//v') AS B(x)
)
SELECT
data
INTO #临时表
FROM (
SELECT
'第'+RTRIM(RID)+'列' AS data,
RID,
flag=0
FROM Liang
UNION ALL
SELECT
'SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='''+data+'''',
RID,
1
FROM Liang2
) AS A
ORDER BY RID,flag
SELECT * FROM #临时表
DROP TABLE #临时表
/*
data
---------------------------------------------------------------------
第1列
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-1-4'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-2-3'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-3-7'
第2列
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-4-4'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-5-6'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-7-12'
第3列
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-2-4'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-4-3'
(11 行受影响)
*/
---------------------------------
-- Author: liangCK 小梁
---------------------------------
--> 生成测试数据: @T
DECLARE @T TABLE (data VARCHAR(100))
INSERT INTO @T
SELECT '2009-1-4,2009-2-3,2009-3-7' UNION ALL
SELECT '2009-4-4,2009-5-6,2009-7-12' UNION ALL
SELECT '2009-2-4,2009-4-3'
--SQL查询如下:
SELECT ID=IDENTITY(INT,1,1),* INTO #T FROM @T
SELECT TOP 100 ID=IDENTITY(INT,1,1) INTO #Seq FROM sysobjects
SELECT
A.ID,
SUBSTRING(A.data,B.ID,CHARINDEX(',',A.data+',',B.ID)-B.ID) AS s,
RID=IDENTITY(INT,1,1)
INTO #data
FROM #T AS A
JOIN #Seq AS B
ON SUBSTRING(','+A.data,B.ID,1)=','
SELECT
data
INTO #插入到临时表中
FROM(
SELECT data='第'+RTRIM(ID)+'列',ID,0 AS flag
FROM #data
GROUP BY ID
UNION ALL
SELECT 'SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='''+s+'''',ID,1
FROM #data
) AS A
ORDER BY ID,flag
SELECT *
FROM #插入到临时表中
DROP TABLE #T,#Seq,#data,#插入到临时表中
/*
data
----------------------------------------------------
第1列
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-1-4'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-2-3'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-3-7'
第2列
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-4-4'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-5-6'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-7-12'
第3列
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-2-4'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-4-3'
(11 行受影响)
*/
---------------------------------
-- Author: liangCK 小梁
---------------------------------
--> 生成测试数据: @T
DECLARE @T TABLE (data VARCHAR(100))
INSERT INTO @T
SELECT '2009-1-4,2009-2-3,2009-3-7' UNION ALL
SELECT '2009-4-4,2009-5-6,2009-7-12' UNION ALL
SELECT '2009-2-4,2009-4-3'
--SQL查询如下:
SELECT ID=IDENTITY(INT,1,1),* INTO #T FROM @T
SELECT TOP 100 ID=IDENTITY(INT,1,1) INTO #Seq FROM sysobjects
SELECT
A.ID,
SUBSTRING(A.data,B.ID,CHARINDEX(',',A.data+',',B.ID)-B.ID) AS s,
RID=IDENTITY(INT,1,1)
INTO #data
FROM #T AS A
JOIN #Seq AS B
ON SUBSTRING(','+A.data,B.ID,1)=','
SELECT
data
FROM(
SELECT data='第'+RTRIM(ID)+'列',ID,0 AS flag
FROM #data
GROUP BY ID
UNION ALL
SELECT 'SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='''+s+'''',ID,1
FROM #data
) AS A
ORDER BY ID,flag
DROP TABLE #T,#Seq,#data
/*
data
-----------------------------------------------------
第1列
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-1-4'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-2-3'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-3-7'
第2列
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-4-4'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-5-6'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-7-12'
第3列
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-2-4'
SELECT * FROM A WHERE CONVERT(VARCHAR(10),GETDATE(),121)='2009-4-3'
(11 行受影响)
*/
CREATE TABLE TB(BeginDt VARCHAR(100), ID INT IDENTITY(1,1))
INSERT TB
SELECT '2009-1-4,2009-2-3,2009-3-7' UNION ALL
SELECT '2009-4-4,2009-5-6,2009-7-12,2009-8-13' UNION ALL
SELECT '2009-1-1'
SELECT TOP 100 ID=IDENTITY(INT,1,1) INTO #T FROM SYSCOLUMNS
SELECT A.ID,SUBSTRING(BeginDt, B.ID, CHARINDEX(',', BeginDt+',', B.ID)-B.ID) AS BeginDt,ID2=IDENTITY(INT,1,1) INTO TB2
FROM TB AS A , #T AS B
WHERE CHARINDEX(',', ','+BeginDt, B.ID)=B.ID
DECLARE @SQL VARCHAR(8000)
SET @SQL=''
SELECT @SQL=@SQL+','+'MAX(CASE WHEN ID='+RTRIM(ID)+' THEN CONVERT(VARCHAR(10),BeginDt,120) ELSE NULL END) AS BeginDt'+RTRIM(ID)
FROM TB
GROUP BY ID
SET @SQL=STUFF(@SQL,1,1,'')
EXEC('SELECT '+@SQL+'
FROM (
SELECT *,SEQ=ID2-(SELECT COUNT(*) FROM TB2 WHERE ID<A.ID) FROM TB2 AS A
) T
GROUP BY SEQ
')
DROP TABLE #T
DROP TABLE TB2
DROP TABLE TB
/*
BeginDt1 BeginDt2 BeginDt3
---------- ---------- ----------
2009-1-4 2009-4-4 2009-1-1
2009-2-3 2009-5-6 NULL
2009-3-7 2009-7-12 NULL
NULL 2009-8-13 NULL
*/
CREATE TABLE TB(BeginDt VARCHAR(100), ID INT IDENTITY(1,1))
INSERT TB
SELECT '2009-1-4,2009-2-3,2009-3-7' UNION ALL
SELECT '2009-4-4,2009-5-6,2009-7-12,2009-8-13' UNION ALL
SELECT '2009-1-1'
SELECT TOP 100 ID=IDENTITY(INT,1,1) INTO #T FROM SYSCOLUMNS
SELECT A.ID,SUBSTRING(BeginDt, B.ID, CHARINDEX(',', BeginDt+',', B.ID)-B.ID) AS BeginDt,ID2=IDENTITY(INT,1,1) INTO TB2
FROM TB AS A , #T AS B
WHERE CHARINDEX(',', ','+BeginDt, B.ID)=B.ID
DECLARE @SQL VARCHAR(8000)
SET @SQL=''
SELECT @SQL=@SQL+','+'MAX(CASE WHEN ID='+RTRIM(ID)+' THEN BeginDt ELSE NULL END) AS BeginDt'+RTRIM(ID)
FROM TB
GROUP BY ID
SET @SQL=STUFF(@SQL,1,1,'')
EXEC('SELECT '+@SQL+'
FROM (
SELECT *,SEQ=ID2-(SELECT COUNT(*) FROM TB2 WHERE ID<A.ID) FROM TB2 AS A
) T
GROUP BY SEQ
')
DROP TABLE #T
DROP TABLE TB2
DROP TABLE TB
/*
BeginDt1 BeginDt2 BeginDt3
---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
2009-1-4 2009-4-4 2009-1-1
2009-2-3 2009-5-6 NULL
2009-3-7 2009-7-12 NULL
NULL 2009-8-13 NULL
*/
---------------------------------
-- Author: liangCK 小梁
---------------------------------
--> 生成测试数据: @T
DECLARE @T TABLE (data VARCHAR(100))
INSERT INTO @T
SELECT '2009-1-4,2009-2-3,2009-3-7' UNION ALL
SELECT '2009-4-4,2009-5-6,2009-7-12' UNION ALL
SELECT '2009-2-4,2009-4-3,2009-7-7'
--SQL查询如下:
SELECT ID=IDENTITY(INT,1,1),* INTO #T FROM @T
SELECT TOP 100 ID=IDENTITY(INT,1,1) INTO #Seq FROM sysobjects
SELECT
A.ID,
SUBSTRING(A.data,B.ID,CHARINDEX(',',A.data+',',B.ID)-B.ID) AS s,
RID=IDENTITY(INT,1,1)
INTO #data
FROM #T AS A
JOIN #Seq AS B
ON SUBSTRING(','+A.data,B.ID,1)=','
DECLARE @str VARCHAR(1000)
SET @str=''
SELECT @str=@str+',MAX(CASE WHEN ID='+RTRIM(ID)+' THEN s ELSE '''' END) dt'+RTRIM(ID)
FROM #T
SET @str=STUFF(@str,1,1,'')
EXEC ('
SELECT '+@str+'
FROM (
SELECT
*,
Seq=(SELECT COUNT(*)+1
FROM #data
WHERE ID=A.ID
AND RID<A.RID)
FROM #data AS A
) AS A
GROUP BY Seq
')
DROP TABLE #T,#Seq,#data
/*
dt1 dt2 dt3
------------------- --------------------- ---------------
2009-1-4 2009-4-4 2009-2-4
2009-2-3 2009-5-6 2009-4-3
2009-3-7 2009-7-12 2009-7-7
(3 行受影响)
*/
---------------------------------
-- Author: liangCK 小梁
---------------------------------
--> 生成测试数据: @T
DECLARE @T TABLE (data VARCHAR(100))
INSERT INTO @T
SELECT '2009-1-4,2009-2-3,2009-3-7' UNION ALL
SELECT '2009-4-4,2009-5-6,2009-7-12'
--SQL查询如下:
SELECT ID=IDENTITY(INT,1,1),* INTO #T FROM @T
SELECT TOP 100 ID=IDENTITY(INT,1,1) INTO #Seq FROM sysobjects
SELECT
A.ID,
SUBSTRING(A.data,B.ID,CHARINDEX(',',A.data+',',B.ID)-B.ID) AS s,
RID=IDENTITY(INT,1,1)
INTO #data
FROM #T AS A
JOIN #Seq AS B
ON SUBSTRING(','+A.data,B.ID,1)=','
DECLARE @str VARCHAR(1000)
SET @str=''
SELECT @str=@str+',MAX(CASE WHEN ID='+RTRIM(ID)+' THEN s ELSE '''' END) dt'+RTRIM(ID)
FROM #T
SET @str=STUFF(@str,1,1,'')
EXEC ('
SELECT '+@str+'
FROM (
SELECT
*,
Seq=(SELECT COUNT(*)+1
FROM #data
WHERE ID=A.ID
AND RID<A.RID)
FROM #data AS A
) AS A
GROUP BY Seq
')
DROP TABLE #T,#Seq,#data
/*
dt1 dt2
-------------------------------- ------------------------
2009-1-4 2009-4-4
2009-2-3 2009-5-6
2009-3-7 2009-7-12
(3 行受影响)
*/