2013-01-16 89 views
1

我想从一个表(或存储过程)插入数据到临时表。临时表列计数与源表列计数不匹配。我想要将来源数据从开始列插入到临时表中,其余列将清空字符串列。从另一个表中插入表甚至列数不匹配?

这意味着如果Temp表有10列,并且源表只有3列,则将前3列插入临时表中,其余7列将为空或空。

例子:

CREATE TABLE #VarTemp(Col1 nvarchar(256), Col2 nvarchar(256), Col3 nvarchar(256), 
         Col4 nvarchar(256), Col5 nvarchar(256), Col6 nvarchar(256), 
         Col7 nvarchar(256), Col8 nvarchar(256), Col9 nvarchar(256), 
         Col10 nvarchar(256)) 

INSERT into #VarTemp 
    EXEC sp_FindStringInTable 'Nareshbhai%', 'dbo', 'UserstoClean'; 

SELECT * FROM #VarTemp 

如果我执行单独

EXEC sp_FindStringInTable 'Nareshbhai%', 'dbo', 'UserstoClean'; 

我越来越

Constitid FirstName LastName email status   pincode 
3151502 Nareshbhai Desai [email protected] Inactive desai 

错误是

有一个错误。检查以确保对象存在。 (0行(S)的影响)

消息0,级别11,状态0,行0
当前命令发生了严重错误。如果有的话,结果应该被丢弃。

sp_FindStringInTable

ALTER PROCEDURE [dbo].[sp_FindStringInTable] 
    @stringToFind VARCHAR(100), @schema sysname, @table sysname 
AS 
    DECLARE @sqlCommand VARCHAR(8000) 
    DECLARE @where VARCHAR(8000) 
    DECLARE @columnName sysname 
    DECLARE @cursor VARCHAR(8000) 

BEGIN TRY 
    SET @sqlCommand = 'SELECT * FROM ' + @schema + '.' + @table + ' WHERE' 
    SET @where = '' 

    SET @cursor = 'DECLARE col_cursor CURSOR FOR 
     SELECT COLUMN_NAME 
     FROM ' + DB_NAME() + '.INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_SCHEMA = ''' + @schema + ''' 
     AND TABLE_NAME = ''' + @table + ''' 
     AND DATA_TYPE IN (''char'', ''nchar'', ''ntext'', ''nvarchar'', ''text'', ''varchar'')' 

    EXEC (@cursor) 

    OPEN col_cursor  
    FETCH NEXT FROM col_cursor INTO @columnName  

    WHILE @@FETCH_STATUS = 0  
    BEGIN  
     IF @where <> '' 
      SET @where = @where + ' OR' 

     SET @where = @where + ' ' + @columnName + ' LIKE ''' + @stringToFind + '''' 
     FETCH NEXT FROM col_cursor INTO @columnName  
    END  

    CLOSE col_cursor  
    DEALLOCATE col_cursor 

    SET @sqlCommand = @sqlCommand + @where 
    --PRINT @sqlCommand 
    EXEC (@sqlCommand) 
END TRY 
BEGIN CATCH 
    PRINT 'There was an error. Check to make sure object exists.' 
    IF CURSOR_STATUS('variable', 'col_cursor') <> -3 
    BEGIN 
     CLOSE col_cursor  
     DEALLOCATE col_cursor 
    END 
END CATCH 
GO 

回答

1

,因为它出现在这里这是行不通的:

'' SELECT * FROM '+ @schema +'。” + @table +“其中”'

您正在加载动态SQL生成表中的所有列的列结果。除非所有这些表格明确地只有与您明确定义的相同的10列,否则会中断。为什么需要将表格动态选择到临时表中?如果您只想查找具有特定类型数据类型的表并选择前十个结果,那么这将起作用。

declare @Temp table (id int identity, val varchar(64)) 

--insert into @Temp 
select distinct 
    'select top 10 * from ' + s.name + '.' + t.name 

from sys.tables t (nolock) 
    join sys.schemas s (nolock) on t.schema_id = s.schema_id 
    join sys.columns c (nolock) on t.object_id = c.object_id 
    join sys.types ty (nolock) on c.system_type_id = ty.system_type_id 
     and ty.name in ('char', 'nchar', 'ntext', 'nvarchar') --etc, if you want to find specific column types listed only 

declare @Current int = 1, @max int, @SQL varchar(max); 

select @Max = max(id) from @Temp 

while @Current <= @Max 
BEGIN 
    select @SQL = val from @Temp where id = @Current 

    exec (@SQL) 

    set @Current += 1; 
END 
相关问题