2015-04-10 4 views
0

У меня есть динамическая инструкция SQL, которая генерирует серию операторов обновления, но не включает значение в предложении set и where where в одинарной кавычки. кто-нибудь знает, как это исправить? вот мой код.нужна динамическая помощь SQL

Declare @OldSSN VARCHAR(9) 
    Declare @NewSSN VARCHAR(9) 
    Declare @cmd VARCHAR(MAX) 
    Set @OldSSN='000000000' 
    Set @NewSSN='000000001' 

Select @cmd = COALESCE(@cmd,'') + 
' 
    UPDATE ' + TABLE_NAME + ' SET ' + Column_Name + ' = ' + @NewSSN + ' 
    WHERE ' + Column_Name + ' = ' + @OldSSN +' 
' 

    From INFORMATION_SCHEMA.COLUMNS 
Where Column_Name like 'SSN%'  
OR Column_Name LIKE 'ssn%'   
OR Column_Name LIKE 'ssn%'   
OR Column_Name LIKE '%_ssn%'    
OR Column_Name LIKE '_ocsecno'   
OR Column_Name LIKE 'Ssn%'; 

Select @cmd 

Выход при выполнении

UPDATE appl_view 
    SET ssn = 000000001 
    WHERE ssn = 000000000 

    UPDATE ap_paid 
    SET ssn = 000000001 
    WHERE ssn = 000000000 

Я пытаюсь выяснить, как заключите значения Ssn в опалить кавычки, как показано ниже

UPDATE appl_view 
    SET ssn = '000000001' 
    WHERE ssn = '000000000' 

    UPDATE ap_paid 
    SET ssn = '000000001' 
    WHERE ssn = '000000000' 
+1

Не уверен, что, если я правильно понял проблему, но вы можете использовать две кавычки («»), чтобы создать одиночную кавычку –

+1

Почему вы хранящие ПЛА в виде обычного текста? Вы знаете, что это потенциально может нарушить закон? Сделай себе и своей компании пользу и зашифруйте это сразу. –

+0

@SeanLange Нельзя хранить их в текстовом формате, но это не совсем лучшая идея. –

ответ

0

Используйте тройной сингл кавычки для передать метку котировки в строку

Выбрать @cmd = COALESCE (@cmd, '') + ' ОБНОВЛЕНИЕ' + TABLE_NAME + 'SET' + column_name + '= ''' + @NewSSN + '' ''
где '+ column_name +' = '' '+ @OldSSN + ''' '

-1
Select @cmd = COALESCE(@cmd,'') + 
' 
    UPDATE [' + TABLE_NAME + '] SET [' + Column_Name + '] = ''' + @NewSSN + ''' 
    WHERE [' + Column_Name + '] = ''' + @OldSSN + ''' 
' 
0

Я предполагаю, что вы собираетесь выполнить этот динамический sql в какой-то момент? Если это так, вы можете использовать функцию параметров sp_executesql и не беспокоиться о котировках. (Вам нужно использовать nvarchar, однако).

Вот простой пример.

--------------------------------------------------------------------------- 
-- Create a table to test against 
--------------------------------------------------------------------------- 
CREATE TABLE TestTable 
(
    TestTableID INT IDENTITY, 
    Text1 VARCHAR(10) 
); 

--------------------------------------------------------------------------- 
-- Seed the table 
--------------------------------------------------------------------------- 
INSERT INTO TestTable   
VALUES ('000000000'); 
INSERT INTO TestTable   
VALUES ('000000003'); 
INSERT INTO TestTable   
VALUES ('000000004'); 

--------------------------------------------------------------------------- 
-- Make and execute dynamic sql 
--------------------------------------------------------------------------- 
DECLARE @cmd NVARCHAR(100), 
     @SqlParms NVARCHAR(100);  

SET @cmd = N'UPDATE TestTable SET Text1 = @NewSSN WHERE Text1 = @OldSSN'; 
SET @SqlParms = N'@NewSSN varchar(9), @OldSSN varchar(9)'; 

EXECUTE sp_executesql @cmd, @SqlParms, @NewSSN = N'000000001', @OldSSN = N'000000000'; 

--------------------------------------------------------------------------- 
-- Result should have updated the first row from '000000000' to '000000001' 
--------------------------------------------------------------------------- 
SELECT * FROM TestTable;