Bel*_*igh 1 sql-server t-sql sql-server-2008-r2
我正在尝试运行动态 SQL 语句,它适用于任何storename
没有撇号的语句。但是,当其中storename
包含撇号时,语法不正确,但是在这种情况下我无法使用动态 SQL。
我应该如何修改此语法storename
以包含 apastrophe?
这是 DDL
Declare @TestHyphens Table(StoreName varchar(500),topItemSale varchar(500))
Insert Into @TestHyphens (StoreName, topItemSale) Values
('Bob''s Burger''s','Pen'), ('Jacks Coffee Shop','Pencil')
,('Larry''s Hair Shack','Rainbow'), ('Manny''s Sandwich Shop','Sunglasses')
Declare @sql nvarchar(4000), @storename varchar(500)
Declare db_cursor CURSOR FOR
Select StoreName
FROM @TestHyphens
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @storename
While @@FETCH_STATUS = 0
BEGIN
Set @storename = REPLACE(@storename, '''', '''''''''');
SET @storename = CHAR(39)+CHAR(39)+@storename+CHAR(39)+CHAR(39);
SET @SQL = N'Select * from @TestHyphens where storename IN ('+@storename+ N')'
Print @storename
Print @sql
FETCH NEXT FROM db_cursor INTO @storename
END
Close db_cursor
DEALLOCATE db_cursor
Run Code Online (Sandbox Code Playgroud)
和打印语句产生:
''Bob''''s Burger''''s''
Select * from @TestHyphens where storename IN (''Bob''''s Burger''''s'')
''Jacks Coffee Shop''
Select * from @TestHyphens where storename IN (''Jacks Coffee Shop'')
''Larry''''s Hair Shack''
Select * from @TestHyphens where storename IN (''Larry''''s Hair Shack'')
''Manny''''s Sandwich Shop''
Select * from @TestHyphens where storename IN (''Manny''''s Sandwich Shop'')
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,这些被错误地连字符 -
''Manny''''s Sandwich Shop''
''Larry''''s Hair Shack''
''Bob''''s Burger''''s''
Run Code Online (Sandbox Code Playgroud)
您可以临时更改 QUOTED_IDENTIFIER。
DECLARE @TestHyphens TABLE(StoreName varchar(500),topItemSale varchar(500))
INSERT INTO @TestHyphens (StoreName, topItemSale) VALUES
('Bob''s Burger''s','Pen'),
('Jacks Coffee Shop','Pencil'),
('Larry''s Hair Shack','Rainbow'),
('Manny''s Sandwich Shop','Sunglasses');
SET QUOTED_IDENTIFIER OFF
SELECT StoreName, TopItemSale
FROM @TestHyphens
WHERE StoreName = "Bob's Burger's"
SET QUOTED_IDENTIFIER ON
| StoreName | topItemSale |
|----------------|-------------|
| Bob's Burger's | Pen |
Run Code Online (Sandbox Code Playgroud)
雷克斯特在这里
在光标内使用
DECLARE @sql nvarchar(MAX), @storename varchar(500)
DECLARE db_cursor CURSOR FOR
SELECT StoreName
FROM #TestHyphens
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @storename
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = N'SET QUOTED_IDENTIFIER OFF '
+ N'Select * from #TestHyphens where StoreName = "' + @storename + N'"'
+ N'SET QUOTED_IDENTIFIER ON';
EXECUTE SP_EXECUTESQL @SQL;
FETCH NEXT FROM db_cursor INTO @storename
END
CLOSE db_cursor
DEALLOCATE db_cursor
Run Code Online (Sandbox Code Playgroud)
这是结果:
| StoreName | topItemSale |
|-----------------------|-------------|
| Bob's Burger's | Pen |
| Jacks Coffee Shop | Pencil |
| Larry's Hair Shack | Rainbow |
| Manny's Sandwich Shop | Sunglasses |
Run Code Online (Sandbox Code Playgroud)
雷克斯特在这里