我正在尝试将所有文本字段列合并为数据库中每行和每个表的一列。我已经为指定的表执行了此操作,但我想为所有表执行此操作。
这是我到目前为止所做的:
DECLARE @YourTableName varchar(1000)
DECLARE @YourColumns varchar(max)
DECLARE @YourQuery varchar(max)
SET @YourTableName='COUNTRY'
SELECT
@YourColumns=STUFF(
(SELECT
'+ ''$$'' +'
+ CASE
WHEN DATA_TYPE IN ('varchar','nvarchar','text','ntext','char','nchar') THEN '''' + [COLUMN_NAME] + '@@'' + ' + 'COALESCE(CONVERT(varchar(max),' + CONVERT(varchar(max),COLUMN_NAME)+'),''NULL'')'
END
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = @YourTableName
FOR XML PATH('')
), 1, 2, ''
)
SET @YourQuery = 'SELECT '+@YourColumns+' FROM '+@YourTableName
EXEC (@YourQuery)
我的输出将是这样的:
$$COUNTRY_NAME@@United States of America$$COUNTRY_CODE@@USA...
$$COUNTRY_NAME@@United Kingdom$$COUNTRY_CODE@@GBR...
$$COUNTRY_NAME@@France$$COUNTRY_CODE@@FRA...
...
我已经设置了表名,我想为数据库中的每个表执行此工作,而不必指定每个表名。
答案 0 :(得分:2)
基本上,您可以尝试使用以下三种方法之一:
使用Cursor迭代每个表,在某些范围内,它与下面的第3项相同,但可能会带来性能问题。
使用动态SQL构建@AllTables VARCHAR(MAX)
,但如果所有表格的总长度超过8000,则会产生一个问题,但不准确。
使用临时表迭代每个表。
CREATE TABLE #TEMP
(
TABLENAME VARCHAR(500),
[COUNTER] INT IDENTITY(1,1)
)
INSERT INTO #TEMP
SELECT name
FROM sys.tables
DECLARE @YourTableName varchar(1000)
DECLARE @YourColumns varchar(max)
DECLARE @YourQuery varchar(max)
DECLARE @Control int = 1
WHILE (@Control <= (SELECT MAX([COUNTER]) FROM #TEMP))
BEGIN
SELECT @YourTableName = TABLENAME
FROM #TEMP
WHERE [COUNTER] = @Control
SELECT
@YourColumns=STUFF(
(SELECT
'+ ''$$'' +'
+ CASE
WHEN DATA_TYPE IN ('varchar','nvarchar','text','ntext','char','nchar') THEN '''' + [COLUMN_NAME] + '@@'' + ' + 'COALESCE(CONVERT(varchar(max),' + CONVERT(varchar(max),COLUMN_NAME)+'),''NULL'')'
END
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = @YourTableName
FOR XML PATH('')
), 1, 2, ''
)
SET @YourQuery = 'SELECT '+@YourColumns+' FROM '+@YourTableName
PRINT @YourQuery
--EXEC (@YourQuery)
SET @Control = @Control + 1
END
答案 1 :(得分:0)
M.Eedan,
您可以尝试按照以下方式使用光标:
DECLARE @YourTableName varchar(1000)
DECLARE @YourColumns varchar(max)
DECLARE @YourQuery varchar(max)
DECLARE table_cursor CURSOR FOR
SELECT name FROM SYS.tables WHERE TYPE = 'U'
OPEN table_cursor
FETCH NEXT FROM table_cursor INTO @YourTableName
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT
@YourColumns=STUFF(
(SELECT
'+ ''$$'' +'
+ CASE
WHEN DATA_TYPE IN ('varchar','nvarchar','text','ntext','char','nchar') THEN '''' + [COLUMN_NAME] + '@@'' + ' + 'COALESCE(CONVERT(varchar(max),' + CONVERT(varchar(max),COLUMN_NAME)+'),''NULL'')'
END
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = @YourTableName
FOR XML PATH('')
), 1, 2, ''
)
SET @YourQuery = 'SELECT '+@YourColumns+' FROM '+@YourTableName
EXEC (@YourQuery)
FETCH NEXT FROM table_cursor INTO @YourTableName
END
CLOSE table_cursor
DEALLOCATE table_cursor
这将为每个表提供单独的数据集。但请注意,在较大行和实验截断时,您可能会超出最大数据类型大小。