Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 当where子句中存在变量时,无法从nvarchar转换为int_Sql Server_Tsql_Where - Fatal编程技术网

Sql server 当where子句中存在变量时,无法从nvarchar转换为int

Sql server 当where子句中存在变量时,无法从nvarchar转换为int,sql-server,tsql,where,Sql Server,Tsql,Where,我在SQL Server中编写此代码是为了获得列“A”,B”中的值所在的行数Z'分别大于0。但是SQL Server告诉我 无法从nvarchar转换为int 我尝试将quotename更改为[A]>0,没关系。但我必须计算I=1…26。正确的说法是什么 谢谢大家! > P>不能在这样的SQL语句中间动态指定列名。 您可以构造一个包含SQL语句的字符串,然后执行它: select @now_total = COUNT(*) from CountTable where quotename(CH

我在SQL Server中编写此代码是为了获得列“A”,B”中的值所在的行数Z'分别大于0。但是SQL Server告诉我

无法从nvarchar转换为int

我尝试将
quotename
更改为
[A]>0
,没关系。但我必须计算I=1…26。正确的说法是什么


谢谢大家!

> P>不能在这样的SQL语句中间动态指定列名。

您可以构造一个包含SQL语句的字符串,然后执行它:

select @now_total = COUNT(*) 
from CountTable 
where quotename(CHAR(65 + @i - 1)) > 0 ;
正如你所看到的,这一点都不好玩

最好将您的表结构从

declare @now_total int
declare @sql nvarchar(max)
set @sql = 
   'select @now_total = count(*) from CountTable where ' + quotename(char(64+@i)) + ' > 0;'
exec sp_executesql @sql, N'@now_total int output', @now_total output;
差不多

create table CountTable (A int, B int, C int, ...)    
insert CountTable values (1, 34, 0, ..)
然后,您的查询将变为

create table CountTable (CountId int, ValueId char(1), Count int)
insert CountTable values (1, 'A', 1)
insert CountTable values (1, 'B', 34)
insert CountTable values (1, 'C', 0)
...

而且您不必使用动态SQL。

这是因为您无法使用普通SQL动态指定列。这里发生的是
quotename(CHAR(65))
被转换成
[A]
。但是没有使用列
A
,而是将其视为文本。因此,错误是:

将nvarchar值“[A]”转换为数据时,转换失败 输入int

您应该使用动态sql:

select count(distinct CountId) from CountTable where ValueId=char(64+@i) and Count>0

看起来您的模式有问题。从
A
Z
命名的列是一个不好的标志。请尝试使用动态SQL。这个表是专门用于特定用途的,所以我使用了这些名称。非常感谢!它工作得很好。我不熟悉动态SQL语句,您的回答对我帮助很大。没问题。您可能需要阅读@Blogbeard的答案。他建议重组您的表,这比使用动态sql要好。谢谢您的替代意见!事实上,这个表是从上一个查询生成的,因此很难更改它的模式。原始表单是一个充满大写字母的矩阵,我的目标是计算每个字母的出现率。因此,我首先进行查询以生成问题中描述的表,然后计算每个字母的出现率。
CREATE TABLE tbl(
    ID INT IDENTITY(1, 1),
    A INT,
    B INT
)
INSERT INTO tbl(A, B) VALUES
(1, 1), (1, 2), (2, 2), (2, 3);

DECLARE @now_total INT
DECLARE @i INT = 1
DECLARE @sql NVARCHAR(MAX)

SET @sql = 'SELECT @now_total = COUNT(*) FROM tbl WHERE ' + QUOTENAME(CHAR(65 + @i - 1) ) + ' > 0'
EXEC sp_executesql @sql, N'@now_total INT OUT', @now_total OUT

SELECT @now_total

DROP TABLE tbl