【问题标题】:Surround data with single quote sql server用单引号 sql server 包围数据
【发布时间】:2012-02-17 23:01:27
【问题描述】:

我在 sql server 中有变量,比如

DECLARE @Country varchar(max)
SET @Country='GB,US'

这里存储国家名称并用逗号分隔。我想更改并将值存储在 国家变量,例如 ''GB'、'US'、'DE'、'FR''。

所以我尝试使用类似的东西功能

DECLARE @Country varchar(max)
SET @Country='GB,US'
SELECT @Country=STUFF((SELECT ''', ''' + @Country
              FOR XML PATH ('')),
              1, 2, '')
print @Country

所以请我实现它。如果我可以将“GB”、“US”、“DE”、“FR”这样的国家名称存储到国家变量中,那么我可以发出类似的查询

select * from my table where country in ( @Country)

请帮忙谢谢

【问题讨论】:

标签: sql-server


【解决方案1】:

您不能这样做,因为@country 仍然被视为 SQL Server 的单个变量,而不是数组(SQL Server 中没有数组这样的东西)。

一些解决方法:

1 生成动态SQL

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM dbo.mytable WHERE country IN (' + CHAR(39) 
    + REPLACE(@Country, ',', CHAR(39) + ',' + CHAR(39)) 
    + CHAR(39) + ');';

2 将逗号分隔的值转储到拆分 TVF 中(请参阅this question 了解一种方法,或this blog post 了解多种方法的性能比较)。

【讨论】:

  • 因为CHAR(39)'''''' 漂亮。 CHAR(39) 是一个单引号,当您想要一个字符串包含一个时,您需要用一个额外的单引号对其进行转义。当您想将该字符串嵌入到另一个字符串中时,您需要再次转义并包围它们。它变得丑陋且难以快速阅读。
【解决方案2】:

或者,如果您不想使用动态代码:

DECLARE @my TABLE (country VARCHAR(2))
INSERT INTO @my
SELECT country FROM (VALUES ('GB'),('US'),('DE'),('FR')) t(country)

DECLARE @Country varchar(max)
SET @Country='GB,US'

SET @Country = CASE WHEN LEFT(@Country, 1) <> ',' THEN ',' ELSE '' END
                  + @Country +
               CASE WHEN RIGHT(@Country, 1) <> ',' THEN ',' ELSE '' END

SELECT * FROM @my WHERE CHARINDEX(',' + country + ',', @Country) > 0 

【讨论】:

  • 假设字符串'GB,US'作为参数传入。您能否建议如何构建您的 VALUES 子句(即使用户使用的是 SQL Server 2008 或更高版本,因为该语法不适用于早期版本)?
  • 你解决这个技巧的方式非常糟糕......在我的情况下,'GB,US'将作为参数出现。
猜你喜欢
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
相关资源
最近更新 更多