所以我只是在做类似的事情:
select
[BadData], [WorseDate], [IQuitData]
into
#BadDataTempTable
from
SomeoneElsesMess
我现在想做的事情类似于:
Select
Replace(#BadDataTempTable.*, ',', ' ')
from
#BadDataTempTable -- Replace all commas in every column `with a space--`
这可能吗?如果是这样,请告诉我最简单(非功能)的方法。
感谢。我认为是SQL Server 2012。我正在使用SSMS 17
答案 0 :(得分:1)
不,必须指定列。您可以使用动态SQL来构建更新/查询。然后只需从结果中复制所需的命令。
也许这有助于您入门:
BEGIN
-- Set the replace value
DECLARE @ls_replaceValue NVARCHAR(MAX) = ',';
-- Set the with value
DECLARE @ls_withValue NVARCHAR(MAX) = ' ';
-- Set the table name we want to query
DECLARE @ls_table NVARCHAR(MAX) = 'some_table';
-- Get all of the columns and provide the replace parameters
DECLARE @ls_columns NVARCHAR(MAX) = '';
SELECT @ls_columns = @ls_columns + ', ' + name + ' = REPLACE(' + name + ', ' + '' + '''' + REPLACE(@ls_replaceValue, '''', '''''''') + '''' + ', ' + '''' + REPLACE(@ls_withValue, '''', '''''''') + '''' + ')'
FROM sys.all_columns
WHERE object_id = OBJECT_ID(@ls_table)
AND collation_name IS NOT NULL; -- Skip columns that aren't character based
-- Remove the first ', ' from the column list
SET @ls_columns = SUBSTRING(@ls_columns, 3, LEN(@ls_columns));
IF @ls_columns = ''
BEGIN
PRINT 'Table not found'
RETURN
END
-- Build a query
DECLARE @ls_query_sql NVARCHAR(MAX) = '';
SET @ls_query_sql = 'SELECT ' + @ls_columns + ' FROM ' + @ls_table;
-- Show the results
SELECT @ls_query_sql AS querySQL;
END
答案 1 :(得分:0)
就在OP询问您如何在动态SQL中执行此操作之后,我们将如何处理它。基本上获取表模式信息并连接所有列,以及使用REPLACE
所需的FOR XML
逻辑。这基本上构成了Rigerta发布的声明,但它是动态的。
use tempdb
go
if object_id('tempdb.dbo.#SomeoneElsesBadData') is not null drop table #SomeoneElsesBadData
create table #SomeoneElsesBadData
(
BadData varchar(250),
WorseData varchar(250),
IQuitData varchar(250)
)
declare @sql nvarchar(max)
select @sql = 'select '
+ stuff((select ', '
+ name
+ ' = replace(' + name + ''','', '''')'
from tempdb.sys.columns
where object_id = object_id('tempdb.dbo.#SomeoneElsesBadData')
for xml path('')), 1, 1, '')
+ ' into #BadDataTempTable
from #SomeoneElsesBadData'
exec sp_executesql @sql
在所有条件相同的情况下,数据应该在进入SQL之前进行清理,但现实很少是公平的。