Вставка хранимой процедуры в таблицу не работает из-за того, что идентификатор не найден

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я пытаюсь вставить все записи из TableA в TableB. TableA существует, TableB — нет.

Вот моя хранимая процедура. Этот код работает, но он ограничен фиксированным именем таблицы TableB:

 USE [myDatabaseName]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[myStoreProcedureFileName]
AS
BEGIN
    SELECT * 
    INTO tableB 
    FROM tableA
END
  

Однако я хочу сделать TableB переменной, чтобы я мог передать ее из кода C #, это не работает, пожалуйста, помогите:

 ALTER PROCEDURE [dbo].[myStoreProcedureFileName]
    @tableName varchar(32)
AS
BEGIN
    SELECT * 
    INTO @tableName 
    FROM tableA
END
  

Пожалуйста, помогите — почему SQL Server не распознает @tableName в строке выбора? Решения?

Ответ №1:

Вам необходимо использовать динамический SQL:

 ALTER PROCEDURE [dbo].[myStoreProcedureFileName] (
    @tableName varchar(32)
) AS
BEGIN
    DECLARE @sql NVARCHAR(MAX) = 'SELECT * into @tableName from tableA';
    SET @sql = REPLACE(@sql, '@tableName', @tableName);
    EXEC sp_executesql @sql;
END;
  

Параметры могут заменять константы только в инструкции SQL. Они не могут заменить идентификаторы, операторы, имена функций или ключевые слова.

Комментарии:

1. Спасибо, Гордон! В Oracle эта простая строка работает. СОЗДАЙТЕ ТАБЛИЦУ TABEB КАК SELECT * FROM ТАБЛИЦАА знаете ли вы, как мне это сделать в MS SQL?

2. @Syntax_MM Извините, CREATE TABLE AS синтаксис недоступен в SQL Server.

3. @Syntax_MM . . . Вы можете использовать into предложение в SQL Server (как показано здесь). Но имя не может быть параметром.

4. @Syntax_MM . . . Есть причина, по которой вы не приняли этот ответ?

Ответ №2:

Вы должны использовать динамический SQL

 declare @sql nvarchar(max);

set @sql = N'select * into '   @tableName   N' from tableA';
exec sp_executesql @sql;
  

Комментарии:

1. Спасибо, Дмитрий! В Oracle работает этот простой вариант: СОЗДАЙТЕ ТАБЛИЦУ TABEB КАК SELECT * FROM ТАБЛИЦАА как мне это сделать в MS SQL, MS не распознает КАК?

2. СОЗДАТЬ ИМЯ ТАБЛИЦЫ В КАЧЕСТВЕ ВЫБОРА — это специфическая функция ORACLE. В T-SQL вы можете использовать SELECT … В оператор …. подробности и ограничения см. learn.microsoft.com/en-us/sql/t-sql/queries /…