27,580
社区成员
发帖
与我相关
我的任务
分享
declare @command1 nvarchar(4000)
set @command1='insert into Alldata select * FROM ? WHERE Check_MD5='''+rtrim(@value)+''' or Check_MD5=''0x'+rtrim(@value)+''''
exec sp_MSforeachtable @command1=@command1,
@whereand="and o.name like 'USB%'"
IF OBJECT_ID('Pr_InsertData','P') IS NULL
EXEC('CREATE PROCEDURE Pr_InsertData AS RETURN')
GO
ALTER PROCEDURE Pr_InsertData(
@TargetTable VARCHAR(128) = 'Test', -- 目标表
@SourceTable VARCHAR(MAX) = 'Test1;Test2', -- 源表列表,表之间';'分割
@nType INT = 0, -- 1精确匹配,0模糊匹配
@HasIdentity TINYINT = 1, -- 是否包含自增字段
@TargetDB VARCHAR(128) = NULL, -- 目标数据库
@SourceDB VARCHAR(128) = NULL -- 源数据库
)
AS
BEGIN
SET NOCOUNT ON
SET @TargetDB = ISNULL(@TargetDB,DB_NAME())
SET @SourceDB = ISNULL(@SourceDB,DB_NAME())
DECLARE
@sql NVARCHAR(MAX),
@Parm NVARCHAR(MAX),
@ColumnList NVARCHAR(MAX),
@UpdateList NVARCHAR(MAX),
@TableList XML,
@TableName VARCHAR(128),
@RowID INT,
@RowCount INT
SET @TableList = '<row>' + REPLACE(@SourceTable,';','</row><row>')+'</row>'
SELECT
T.c.value('.','nvarchar(max)') AS TableName
INTO
#SourceList
FROM
@TableList.nodes('row') T(c)
SELECT
IDENTITY(INT,1,1) AS RowID,
a.Name
INTO
#TableList
FROM
sys.tables a, #SourceList b
WHERE
name <> @TargetTable
AND (
( @nType = 1 AND a.name = b.TableName)
OR ( @nType = 0 AND a.name LIKE '%' + b.TableName + '%')
)
SELECT @RowCount = @@ROWCOUNT, @RowID = 1
WHILE @RowID <= @RowCount
BEGIN
SELECT @TableName = name FROM #TableList WHERE RowID = @RowID
SET @ColumnList = ''
SET @UpdateList = ''
SET @SQL = 'SELECT '
+ ' @ColumnList = CASE WHEN @ColumnList = '''' THEN '''' ELSE @ColumnList + '','' END + b.name, '
+ ' @UpdateList = CASE WHEN @UpdateList = '''' THEN '''' ELSE @UpdateList + '','' END + ''U.'' + b.name + ''=I.'' + b.name'
+ ' FROM ' + @TargetDB + '.sys.tables a WITH(NOLOCK) INNER JOIN ' + @TargetDB + '.sys.columns b WITH(NOLOCK) ON a.object_id = b.object_id '
+ ' WHERE a.name = ''' + @TableName + ''' '
+ ' AND a.type=''U'' '
+ ' AND b.is_computed = 0 '
+ CASE WHEN @HasIdentity = 0 THEN ' AND b.is_identity = 0 ' ELSE '' END
+ ' AND b.name IN (SELECT bb.name '
+ ' FROM ' + @SourceDB + '.sys.tables aa WITH(NOLOCK) '
+ ' INNER JOIN ' + @SourceDB + '.sys.columns bb WITH(NOLOCK) ON aa.object_id = bb.object_id '
+ ' WHERE aa.name = ''' + @TableName + ''' AND aa.type=''U'' '
+ CASE WHEN @HasIdentity = 0 THEN ' AND bb.is_identity = 0 ' ELSE '' END
+ ' AND bb.is_computed = 0 '
+ ' ) '
+ ' ORDER BY b.column_id'
SET @Parm = '@ColumnList NVARCHAR(MAX) OUTPUT,@UpdateList NVARCHAR(MAX) OUTPUT'
EXEC sp_executesql @SQL,@Parm,@ColumnList = @ColumnList OUTPUT,@UpdateList = @UpdateList OUTPUT
SET @sql = CASE WHEN @RowID = 1 THEN ' TRUNCATE TABLE ' + @TargetDB + '.dbo.' + @TargetTable + CHAR(13) + CHAR(10) ELSE '' END + CHAR(13) + CHAR(10)
+ ' INSERT ' + @TargetDB + '.dbo.' + @TargetTable + '( ' + @ColumnList + ' ) ' + CHAR(13) + CHAR(10)
+ ' SELECT ' + @ColumnList + CHAR(13) + CHAR(10)
+ ' FROM ' + @SourceDB + '.dbo.' + @TableName + CHAR(13) + CHAR(10)
PRINT @sql
EXEC(@sql)
SET @RowID = @RowID + 1
END
END
GO
declare @command1 nvarchar(4000)
set @command1='insert into Alldata select * FROM ? WHERE PN='+rtrim(@value)
exec sp_MSforeachtable @command1=@command1,
@whereand="and o.name like 'USB%'"
--要多加一对单引号...
declare @command1 nvarchar(4000)
set @command1='insert into Alldata select * FROM ? WHERE PN='''+rtrim(@value)+''''
exec sp_MSforeachtable @command1=@command1,
@whereand="and o.name like 'USB%'"
exec @sql
-- 改成下面这样,加个括号。
exec (@sql )
-- 数据表,你自己建吧,我把过程写给你。
create table tab_list(tname varchar(30))
go
create table test (id int , name varchar(10))
go
create proc sp_data
as
begin
declare @sql varchar(1000) , @tname varchar(30)
declare sss cursor for select * from tab_list ;
open sss
fetch next from sss into @tname
while @@FETCH_STATUS = 0
begin
set @sql = 'insert into test select * from ' + @tname
exec @sql
fetch next from sss into @tname
end
close sss
deallocate sss
end
go