Обновите таблицу, передав имя таблицы, имя столбца как переменную с помощью курсора - PullRequest
2 голосов
/ 21 сентября 2011

Я хочу обновить таблицу. Я получаю Имя таблицы и Имя столбца в виде набора данных XML из внешнего интерфейса. Я написал One Cursor для этого. Но это выдает ошибку. Ниже мой курсор

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[PMT_Formstatus_Update_Test]
(
@XMLTableNames VARCHAR(MAX)
)
AS
BEGIN

DECLARE @docHandle INT, @ErrorMessage VARCHAR(200), @doc VARCHAR(200)
    SET @doc = '<?xml version="1.0" encoding="iso-8859-1" ?>'

    DECLARE @Names TABLE
(   
        TName VARCHAR(50),
    CName VARCHAR(50),
    IDField VARCHAR(50),
    FunctionID INT,
    ID INT,             
    StatusID INT
    )
    SET @XMLTableNames = @doc + @XMLTableNames          
EXEC sp_xml_preparedocument @docHandle OUTPUT,  @XMLTableNames
    INSERT INTO @Names
    SELECT * FROM 
        OPENXML(@docHandle,'NewDataSet/NameDetails',2)
            WITH
            (
                TName VARCHAR(50),
                CName VARCHAR(50),
                IDField VARCHAR(50),
                FunctionID INT,
                ID INT,
                StatusID INT
                            )

    DECLARE @FunctionID INT
DECLARE @StatusID INT
DECLARE @ID INT
    DECLARE @TableName VARCHAR(50)
    DECLARE @ColumnName VARCHAR(50)
DECLARE @IDField VARCHAR(50)

    DECLARE @getTables CURSOR
    SET @getTables = CURSOR FOR
    SELECT FunctionID, TName, CName, StatusID, IDField, ID FROM @Names
    OPEN @getTables
    FETCH NEXT
    FROM @getTables INTO @FunctionID, @TableName, @ColumnName, @StatusID, @IDField, @ID
    WHILE @@FETCH_STATUS = 0
    BEGIN
    UPDATE @TableName SET @ColumnName = 3 WHERE @IDField = @ID
        FETCH NEXT
    FROM @getTables INTO @FunctionID, @TableName, @ColumnName, @StatusID, @IDField, @ID
    END

    CLOSE @getTables
    DEALLOCATE @getTables
END

Как написать Update Query в этом случае? Пожалуйста, мне нужны все ваши предложения ...

Ответы [ 3 ]

1 голос
/ 21 сентября 2011

Можно надеяться, что то, что вы написали, не работает, так как это оператор обновления, выполняемый для табличной переменной, который не влияет на фактические столбцы в этой таблице:

declare @TableName table (ID int not null)
declare @ColumnName1 int
declare @ColumnName2 int
declare @Value int
UPDATE @TableName SET @ColumnName1 = 3 WHERE @ColumnName2= @Value

Одним из способов добиться того, что вы делаете, является динамический SQL. Это некрасиво (и будет еще больше, если типы данных в столбцах различаются). В T-SQL нет реальной системы "метапрограммирования".

1 голос
/ 21 сентября 2011

Вам нужно объединить их как строку, затем вызвать EXEC('')

EXEC ('UPDATE TableName SET ColumnName1 = 3 WHERE ColumnName2= Value')

1 голос
/ 21 сентября 2011

Простой динамический SQL Пример:

DECLARE @SQL NVARCHAR(max),@TableName VARCHAR(128),@ColumnName1 VARCHAR(128),@ColumnName2 VARCHAR(128),@Value NVARCHAR(MAX),@NewValue NVARCHAR(MAX)
SET @TableName='User'
SET @ColumnName1='Session_Id'
SET @ColumnName2='Session_Id_Old'
SET @Value=''''+CAST(NEWID() as NVARCHAR(50))+''''
SET @NewValue=''''+CAST(NEWID() as NVARCHAR(50))+''''

SET @SQL=
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
'UPDATE [@TableName] SET [@ColumnName1] = @NewValue WHERE [@ColumnName2]= @Value','@TableName',@TableName),
'@ColumnName1',@ColumnName1),'@Value',@Value),'@NewValue',@NewValue),'@ColumnName2',@ColumnName2)
        EXECUTE(@SQL)

Вы должны добавить апострофы к обеим сторонам старых / новых значений, если типы данных являются строками

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...