2016-04-11 7 views
0

Neden 362 satırında neden FROM @TableName bağlamında bağlam kaybettiğimi bilmiyorum. Bu kod yığınını aldım ve bir tabloya değil ekrana çıktı olarak değiştirmeye çalışıyorum. SQL Server Management Studio değişkeni tanımıyor, ancak aynı değişkenin hemen üstündeki satırdan geldiğini biliyor.t-sql içerikli bağlamldı

DECLARE @TableName nvarchar(256), 
     @ColumnName nvarchar(128), 
     @SearchStr2 nvarchar(110) 

SET @TableName = '' 
SET @SearchStr2 = QUOTENAME('%28217965%','''') 

WHILE @TableName IS NOT NULL 
BEGIN 
    SET @ColumnName = '' 
    SET @TableName = 
    (
     SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_TYPE = 'BASE TABLE' 
      AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
      AND OBJECTPROPERTY(
        OBJECT_ID(
         QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
         ), 'IsMSShipped') = 0) 

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) 
    BEGIN 
     SET @ColumnName = 
     (
      SELECT MIN(QUOTENAME(COLUMN_NAME)) 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2) 
       AND TABLE_NAME = PARSENAME(@TableName, 1) 
       AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') 
       AND QUOTENAME(COLUMN_NAME) > @ColumnName 
     ) 

     IF @ColumnName IS NOT NULL 
     BEGIN 
      SELECT @TableName + '.' + @ColumnName, LEFT(@ColumnName, 3630) 
      FROM @TableName 
      WHERE @ColumnName + ' LIKE ' + @SearchStr2 
     END 
    END 
END 
+1

ne demek istiyorsun:

gibi bir şey deneyin? – DLeh

+0

Son 'SELECT' ifadesinin ne yapmasını bekliyorsunuz? – David

+0

Bu değişkenin ne olduğunu şimdi biliyor – Justin

cevap

1
 SELECT @TableName + '.' + @ColumnName, LEFT(@ColumnName, 3630) 
     FROM @TableName 
     WHERE @ColumnName + ' LIKE ' + @SearchStr2 

Bu geçerli T-SQL değil. @TableName bir skaler değişkendir, bir tablo değişkeni değildir. Bunun gibi değişken tablo adlarını kullanamazsınız. Denediğiniz şeyi gerçekleştirmek için dinamik SQL kullanmanız gerekir. EXEC() ifadesine bir göz atın. "Bağlam kaybetme" tarafından

DECLARE @SQL VARCHAR(MAX); 

.... 


IF @ColumnName IS NOT NULL 
    BEGIN 
     SELECT @SQL = 'SELECT ' + @TableName + '.' + @ColumnName + ', LEFT(' + 
      @ColumnName + ', 3630) FROM ' + @TableName + ' WHERE ' + @ColumnName + 
      ' LIKE ' + @SearchStr2; 

     EXEC(@SQL); 
    END 
....