2013-01-16 3 views
1

하나의 테이블 (또는 저장 프로 시저)에서 임시 테이블에 데이터를 삽입하려고합니다. 임시 테이블 열 개수가 원본 테이블 열 개수와 일치하지 않습니다. 시작 열에서 임시 테이블에 소스 데이터를 삽입하고 나머지 열은 문자열 열을 비 웁니다.다른 테이블의 테이블에 삽입해도 열 수가 일치하지 않습니다?

즉, Temp 테이블에 10 개의 열이 있고 소스 테이블에 3 개의 열만있는 경우 처음 3 개의 열을 임시 테이블에 삽입하고 나머지 7 개의 열은 비어 있거나 null입니다.

예 :

내가 실행하면
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 

오류를 얻고는

,321입니다 0 오류가 발생했습니다. 개체가 있는지 확인하십시오. (0 행 영향)

메시지 0, 수준 11, 상태 0, 줄 0
현재 명령에서 심각한 오류가 발생했습니다. 결과가 있으면 폐기해야합니다. + @schema + 'SELECT * FROM'

이 ':

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

이 작동하지 않습니다이다'. ' + @ table + 'WHERE' '

테이블의 모든 열의 열 결과를 생성하려면 동적 SQL을로드하고 있습니다. 이 모든 테이블에 명시 적으로 정의한 것과 동일한 10 개의 열만있는 경우가 아니면이를 중단합니다. 임시 테이블에 테이블을 동적으로 선택해야하는 이유는 무엇입니까? 특정 유형의 데이터 유형으로 테이블을 찾고 상위 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 
관련 문제