我需要將文本行連接成1個字符串。我不想使用FOR XML PATH,因爲我需要純文本而不是XML。 我認爲使用遞歸CTE將做的伎倆,但我需要在CTE內使用子查詢來創建基本情況下,CTE中的遞歸情況下不能識別子查詢表。在CTE中使用子查詢,以便我可以使用遞歸
這是我的SQL:
DECLARE @EndCreateTableScript varchar(20) = ') ON [PRIMARY] ';
DECLARE @NewLine varchar(2) = CHAR(13) + CHAR(10);
DECLARE @createTableScript varchar(max)
SET @createTableScript = 'CREATE TABLE ['
;WITH CTE
AS (
SELECT ScriptTbl2.RowNumber, ScriptTbl2.CreateTableStart, ScriptTbl2.ColumnScript, ScriptTbl2.EndTableScript
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY TableName ORDER BY TableName) AS RowNumber, TableName,
CreateTableStart, ColumnTextStart + DataSizeText + ColumnNullText + @NewLine AS ColumnScript, @EndCreateTableScript + TextImageScript AS EndTableScript
FROM
(
SELECT DISTINCT SchemaName, TableName, @createTableScript + SchemaName + '].[' + TableName + '] (' + @NewLine AS CreateTableStart,
'[' +ColName + '] [' + DataType + '] ' AS ColumnTextStart,
CASE WHEN DataType in ('bit', 'int', 'money', 'datetime') THEN ' '
WHEN DataType in ('numeric', 'decimal') THEN '(' + DataTypePrecision + ', ' + DataTypeScale + ') '
WHEN CAST(DataTypeMaxLength AS INT) = -1 THEN '(max) '
WHEN DataType in ('varchar', 'varbinary') THEN '('+ DataTypeMaxLength +') '
WHEN DataType = 'nvarchar' THEN '('+ CAST(CAST(DataTypeMaxLength AS INT)/2 AS varchar(5)) +') '
END AS DataSizeText,
CASE IsColumnNullable WHEN '0' THEN 'NOT NULL,' ELSE 'NULL,' END AS ColumnNullText,
CASE WHEN TextImageFileGroup IS NOT NULL THEN 'TEXTIMAGE_ON [' + TextImageFileGroup + ']' ELSE '' END AS TextImageScript
FROM #DBObjectsToAdd
) AS ScriptTbl
) AS ScriptTbl2
WHERE RowNumber = 1
UNION ALL
SELECT CTE.RowNumber, CTE.CreateTableStart, CTE.ColumnScript + ' ' + ScriptTbl2.ColumnScript, CTE.EndTableScript
FROM CTE JOIN #DBObjectsToAdd ScriptTbl ON CTE.RowNumber = ScriptTbl2.RowNumber + 1
)
SELECT *
FROM CTE
的問題是,子查詢表,ScriptTbl2不遞歸情況下認可。我怎樣才能解決這個問題?
目標是將ColumnScript文本連接到每個表的1行文本。
UPDATE 數據並不重要。我只是想將多行文本連接成1行。 1表1文本1 2表1文本2 3表1文本3 4表2文本4 5表2 Text5
使用CTE遞歸或一些其它類型的查詢變更的: 1表1文本1文本2文本3 2表2文本4 Text5
UPDATE 我創建了一個需要Row_Number作爲遞歸和3個文本字段的臨時表。
CREATE TABLE #TableScripts(RowNumber int, TableStart varchar(100), ColumnScript varchar(max), TableEnd varchar(100))
這是添加數據的SELECT
查詢。
SELECT RowNumber, TableName, CreateTableStart, ColumnScript, TextImageScript
FROM
(
SELECT DISTINCT ROW_NUMBER() OVER (PARTITION BY TableName ORDER BY TableName) AS RowNumber,
SchemaName, TableName, @createTableScript + SchemaName + '].[' + TableName + '] (' + @NewLine AS CreateTableStart,
('[' +ColName + '] [' + DataType + '] ') +
(CASE WHEN DataType in ('bit', 'int', 'money', 'datetime') THEN ' '
WHEN DataType in ('numeric', 'decimal') THEN '(' + DataTypePrecision + ', ' + DataTypeScale + ') '
WHEN CAST(DataTypeMaxLength AS INT) = -1 THEN '(max) '
WHEN DataType in ('varchar', 'varbinary') THEN '('+ DataTypeMaxLength +') '
WHEN DataType = 'nvarchar' THEN '('+ CAST(CAST(DataTypeMaxLength AS INT)/2 AS varchar(5)) +') '
END) +
(CASE IsColumnNullable WHEN '0' THEN 'NOT NULL,' ELSE 'NULL,' END) + @NewLine AS ColumnScript,
@EndCreateTableScript + (CASE WHEN TextImageFileGroup IS NOT NULL THEN 'TEXTIMAGE_ON [' + TextImageFileGroup + ']' ELSE '' END) AS TextImageScript
FROM #DBObjectsToAdd
) AS ScriptTbl
ORDER BY TableName
出於某種原因,添加ROW_NUMBER
函數來查詢增加的行數的表的1從2(它只有2列),從而32.
爲什麼你不想在這裏FOR XML使用?這是做這種事情的方法。 –
由XML創建的文本在有新行或'<' or '>' –
時會添加這些特殊字符您可以發佈表數據和預期輸出嗎? –