2016-04-20 32 views
5

Próbuję użyć dynamicznego SQL po raz pierwszy - Teraz rozumiem jego sens w stopniu, w którym próbuje wprowadzić parametr do tabeli tymczasowej przy użyciu dynamicznego SQL i otrzymuję komunikat "Nieprawidłowy Nazwa kolumny "kiedy po prostu próbuję wprowadzić to jako tekst, który nie ma być kolumną.Nieprawidłowa nazwa kolumny przy użyciu dynamicznego SQL

Na marginesie swej wartości mi przywołujące Używam tego na SQL Server 2005.

To jest moje wykonanie kwerendy

SELECT ARCHV_FLAG,PATNT_REFNO,ACTIVE_NAMES,AINPT_REFNO INTO #TEMP FROM ACTIVE_NAMES WHERE PATNT_REFNO = 1 AND ARCHV_FLAG = 'C' 

Fix SET @SQL = 'SELECT ARCHV_FLAG,PATNT_REFNO,'''[email protected] +''' AS  [ACTIVE_NAMES],'+ @PK + ' INTO #TEMP FROM ' + @TABLE + ' WHERE PATNT_REFNO = '+ CAST(@PATNT AS VARCHAR (100))+ ' AND ARCHV_FLAG = ''C''' 

Wiele z góry dzięki.

DECLARE 
    @SQL NVARCHAR(4000), 
    @SQL1 NVARCHAR(4000), 
    @TABLE VARCHAR (100), 
    @PK VARCHAR (50), 
    @PATNT INT 

SET @PATNT = 1 

CREATE TABLE #TEMP 
(
    ARCHV_FLAG VARCHAR (1), 
    PATNT_REFNO INT, 
    TABLE_NAME VARCHAR (100), 
    PRIMARY_KEY INT 
) 

CREATE TABLE #TABLE 
(NAME VARCHAR (100)) 

INSERT INTO #TABLE (NAME) VALUES ('ACTIVE_NAMES') 

SELECT * FROM #TABLE 

DECLARE Cur CURSOR FOR 
SELECT NAME FROM #TABLE 

OPEN Cur 

FETCH NEXT FROM Cur INTO @TABLE 
WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @PK = (SELECT C.NAME FROM SYS.COLUMNS C 
     JOIN SYS.tables T ON C.object_id = T.object_id 
     WHERE T.name = @TABLE AND C.is_identity = 1) 

SET @SQL = 'SELECT ARCHV_FLAG,PATNT_REFNO,'[email protected] +','+ @PK + ' INTO #TEMP FROM ' + @TABLE + ' WHERE PATNT_REFNO = '+ CAST(@PATNT AS VARCHAR (100))+ ' AND ARCHV_FLAG = ''C''' 
EXEC SP_EXECUTESQL @SQL 

select @sql 

FETCH NEXT FROM Cur INTO @TABLE 
END 
CLOSE Cur 
DEALLOCATE Cur 

SELECT * FROM #TEMP 
DROP TABLE #TEMP 
DROP TABLE #TABLE 
+0

która wersja są u użyciu? działa doskonale na moim końcu. – BNN

+0

Tylko pamiętaj, aby dodać, że w - Używam SQL Server 2005 niestety – user3482471

+0

można zaktualizować ur pytanie, mylące, gdzie dodać. – BNN

Odpowiedz

5

Jeśli chcesz dynamiczny SQL traktować swoją zmienną jako ciąg dosłownym, a nie nazwa kolumny będziesz musiał zawinąć go w apostrofach:

SET @SQL = 'SELECT ARCHV_FLAG,PATNT_REFNO,'''[email protected] +''' AS [ACTIVE_NAMES],'+ @PK + ' INTO #TEMP FROM ' + @TABLE + ' WHERE PATNT_REFNO = '+ CAST(@PATNT AS VARCHAR (100))+ ' AND ARCHV_FLAG = ''C''' 
EXEC SP_EXECUTESQL @SQL 
+0

Cześć George, Dziękuję za komentarz, myślę, że możemy być o krok bliżej. Jednak za pomocą tego otrzymuję teraz tę wiadomość. Msg 1038, Poziom 15, Stan 5, Wiersz 1 Brak nazwy obiektu lub kolumny lub jest pusta. W przypadku instrukcji SELECT INTO sprawdź, czy każda kolumna ma nazwę. W przypadku innych instrukcji szukaj pustych nazw aliasów. Aliasy zdefiniowane jako "" lub [] nie są dozwolone. Dodaj nazwę lub pojedynczą spację jako nazwę aliasu. – user3482471

+0

Poprawiłem fragment kodu powyżej, aby podać alias dla tej kolumny. –

+0

Cześć George, Kiedy używam tego, myślę, że ma zbyt wiele "w". Umieścił w nim resztę mojego skryptu (np. Na czerwono). – user3482471